Подтвердить что ты не робот

Stl vector и С++: как .resize без конструктора по умолчанию?

как я могу сказать STL, особенно для метода resize() в векторе, для инициализации объектов с помощью конструктора, отличного от значения по умолчанию, и с какими параметрами?

Я имею в виду:

class something {
    int a;
    something (int value);
}

std::vector<something> many_things;

many_things.resize (20);

В более общем плане, как я могу заставить STL использовать мой бизнес-конструктор, когда ему нужно создавать объекты, и передать параметры этому конструктору?

в моем случае добавление конструктора по умолчанию не является опцией, и я бы предпочел не использовать массив указателей для решения проблемы.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

#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;
}

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