我正在尝试创建一个对象向量,并希望为向量中的每个对象唯一地调用非默认构造函数.我在下面有一个简化的例子.
在我的例子中,我有一个带有两个构造函数的对象,默认(无args)和非默认(1 arg).当我使用默认构造函数(v1)初始化大小为10的向量时,构造函数被调用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;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
3, 2
1, 2
2, 2
0, 2
3, 2
0, 2
1, 2
2, 2
4, 2
1, 2
Run Code Online (Sandbox Code Playgroud)
解
以下函数可用于返回一个对象向量,其中为每个对象调用非默认构造函数.
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;
}
Run Code Online (Sandbox Code Playgroud)
这是两个解决方法.
使用列表初始化.
std::vector<Obj> v2{5, 5, 5, ...};
Run Code Online (Sandbox Code Playgroud)用于emplace_back稍后插入元素.
std::vector<Obj> v2;
v2.reserve(10);
for (int i=0; i<10; ++i) {
v2.emplace_back(5);
}
Run Code Online (Sandbox Code Playgroud)