Я пытаюсь создать вектор объектов и хотел бы, чтобы конструктор не по умолчанию вызывался уникально для каждого объекта в векторе.У меня есть упрощенный пример ниже.
В моем примере у меня есть объект с двумя конструкторами, по умолчанию (без аргументов) и не по умолчанию (1 аргумент).Когда я инициализировал вектор размером 10, используя конструктор по умолчанию (v1), конструктор вызывается 10 раз (как видно по случайным числам).Однако, когда я пытаюсь инициализировать вектор конструктором, отличным от объекта по умолчанию (v2), конструктор объекта вызывается один раз, и этот объект копируется в оставшиеся элементы в векторе (x больше не является множеством разных случайных чисел).
Можно ли инициализировать вектор из N объектов, чтобы каждый объект вызывал конструктор не по умолчанию для каждого объекта?
Пример кода:
#include <vector>
#include <iostream>
#include <cstdlib>
struct Obj {
int x;
Obj() {
x = rand() % 5;
}
Obj(int max_x) {
x = rand() % max_x;
}
};
int main() {
std::vector<Obj> v1(10); // Default constructor
std::vector<Obj> v2(10, 5); // Non-Default Constructor
for(int i=0; i<10; ++i) {
std::cout << v1[i].x << ", " << v2[i].x << std::endl;
}
}
Выход:
3, 2
1, 2
2, 2
0, 2
3, 2
0, 2
1, 2
2, 2
4, 2
1, 2
Решение
Следующая функция может использоваться для возвратавектор объекта, в котором для каждого объекта вызывается конструктор не по умолчанию.
template <typename T, typename ... Args> std::vector<T> InitVector(const int n, Args ... args) {
std::vector<T> vec;
for(int i = 0; i < n; ++i) {
vec.emplace_back(args ...);
}
return vec;
}