вектор stl и C++: как к .resize без конструктора по умолчанию?

Совместное объединение в различии параметра типа:

public class Baz<T extends Foo & Bar> {}

, Например, если Вы хотели взять параметр, это и Сопоставимо и Набор:

public static <A, B extends Collection<A> & Comparable<B>>
boolean foo(B b1, B b2, A a) {
   return (b1.compareTo(b2) == 0) || b1.contains(a) || b2.contains(a);
}

Этот изобретенный метод возвращает true, если два данных набора равны или если любой из них содержит данный элемент, иначе ложь. Точка для замечания - то, что можно вызвать методы и Сопоставимого и Набор на аргументах b1 и b2.

29
задан jww 22 April 2018 в 02:09
поделиться

4 ответа

Используйте перегрузку с двумя аргументами: many_things.resize (20, something (5));

51
ответ дан 28 November 2019 в 01:34
поделиться

Вы можете использовать reserve () , чтобы увеличить размер буфера и вручную добавить ( push_back () ) необходимые элементы в цикл.

0
ответ дан 28 November 2019 в 01:34
поделиться

я могу придумать решение, но предупреждаю вас, это довольно некрасиво. Я не знаю, почему вы не хотите добавлять конструктор по умолчанию, но если вы просто хотите запретить пользователям этого класса создавать неализованные экземпляры, вы можете просто сделать конструктор по умолчанию закрытым и объявить соответствующий векторный класс своим другом:

class Foo {
public:
   Foo( int x ) : num( x ) {}

   int GetX( ) { return num; }
private:
   friend class std::vector< Foo >;

   int num;
   Foo( ) : num( 10 ) {}
};

Это некрасиво по нескольким причинам, в основном потому, что работает только для одного типа контейнера. Другого пути нет, потому что контейнеры STL просто требуют, чтобы их элементы были конструктивными по умолчанию.

1
ответ дан 28 November 2019 в 01:34
поделиться

С подобной специализацией (извините, я написал это с минимальными проверками)?

#include <vector>

class MyClass
{
    private:
        MyClass();
    public:
        MyClass(unsigned i) : _data(i) {};

    private:
        unsigned _data;
};

typedef std::vector<MyClass> MyVector;

void MyVector::resize(MyVector::size_type new_size)
{
    this->resize(new_size, MyClass(5));
}

int main()
{
    MyVector vector;
    vector.resize(5);

    return 0;
}

Но подумайте, действительно ли вам это нужно. Почему бы вместо этого не создать конструктор по умолчанию?

0
ответ дан 28 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: