Я не уверен, что именно вы хотите, но если вы хотите инициализировать список с некоторыми значениями по умолчанию, а затем использовать другой способ для создания других, вы можете манипулировать списком так, как вы хотите. Позвольте мне уточнить подробнее:
Предположим, что именно так вы определили свой Obj
(в будущем было бы полезно включить вашу реализацию Obj
)
class Obj {
public:
explicit Obj(int arg1, std::string arg2) : arg1_(arg1), arg2_(std::move(arg2)) {}
explicit Obj(std::string arg2) : arg1_(25), arg2_(std::move(arg2)) {}
private:
int arg1_;
std::string arg2_;
};
Теперь векторы могут принимать емкость и необязательное значение по умолчанию.
Если ваш тип не имеет конструктора, который не принимает значений, вы не можете создать такой вектор (без указания значения по умолчанию, поэтому вам нужно передать значение по умолчанию, создав один экземпляр этого объекта, используя любой конструктор, который вы хотите) , Вы всегда можете создать пустой вектор и затем добавлять элементы к нему один за другим. Чтобы повысить производительность, если вы знаете, сколько предметов у вас будет, вы можете зарезервировать для них места в памяти, но пока не добавляйте их. Таким образом, вам не нужно беспокоиться о конструкторе, потому что объекты еще не будут созданы. Последний код в этом посте демонстрирует, как это сделать.
Если у вас есть int, вы можете сделать это:
std::vector<int> myInts{50, 1}; // make a vector of 50 items with default value of 1
myInts[1] = 26; // change the second value to be 26.
Вы можете сделать то же самое с Obj
Obj defaultValue{100, "Type1"};
std::vector<Obj> myObjs{50, defaultValue}; // make a vector of 50 Objs with copies of defaultValue.
Обратите внимание, что это копии, поэтому, если вы измените одну из них, она не изменит другие. Ниже приведено то же, что и выше, но оно в одной строке (передавая rvalue вместо lvalue).
std::vector<Obj> myObjs{50, Obj{100, "Type1"}}; // same thing as above.
Теперь, если вы хотите, чтобы некоторые элементы строились по-разному, вы можете назначить разные значения.
std::vector<Obj> myObjs{50, Obj{100, "Type1"}};
myObjs[0] = Obj{"Type2"};
Если у вас есть много разных способов инициализации этого. Тогда вы можете избежать создания списка со значением по умолчанию и добавлять элементы в вектор один за другим.
std::vector<Obj> myObjs;
myObjs.reserve(100); // expand the capacity but don't actually create any items.
myObjs.push_back(Obj{10, "Type1"});
myObjs.push_back(Obj{"Type2"});