我想看看是否可以在一行中初始化一个对象向量,所以我编写了以下示例:
vector<Bar*> bar(5, new Bar());
bar[3]->hit++;
for (int i = 0; i < 5; i++)
cout << bar[i]->hit << endl;
但是当我运行它时,我得到:
1
1
1
1
1
它似乎对所有指针使用相同的 new Bar() 。是否可以初始化对象指针向量以指向不同的对象?
您的所有指针都指向同一个位置,因此结果是预期的。
vector<Bar*> bar(5, new Bar());
不会Bar
为所有 5 个对象创建一个新对象,而是使用 的返回值(new Bar()
指向内存位置的指针)来生成向量。
要获得您期望的结果,您可以使用std::generate
:
Bar* newBar() { return new Bar(); }
//...
vector<Bar*> bar(5);
std::generate(bar.begin(),bar.end(),newBar);
或者干脆
std::generate(bar.begin(),bar.end(), []{return new Bar();});
如果 C++11 是一个选项。
输出将是
0
0
0
1
0
用几个不同的值初始化一个向量需要 C++11 和对初始化列表的支持:
std::vector<Bar*> v { new Bar, new Bar, new Bar, new Bar };
You can probably use a library like Boost.Assign in versions before C++11.
From the spec:
Effects: Constructs a vector with n copies of value [...]
where n is the first and value the second argument.