我想看看我是否可以在一行中初始化一个对象向量,所以我写了下面的例子:
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
似乎对所有指针使用相同的新Bar()。是否可以初始化对象指针的向量以指向不同的对象?
答案 0 :(得分:3)
所有指针指向同一位置,因此预期结果。
vector<Bar*> bar(5, new Bar());
不会为所有5个对象创建新的Bar
,而是使用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
答案 1 :(得分:1)
初始化具有多个不同值的向量需要C ++ 11并支持初始化列表:
std::vector<Bar*> v { new Bar, new Bar, new Bar, new Bar };
你可以在C ++ 11之前的版本中使用像Boost.Assign这样的库。
答案 2 :(得分:0)
来自规范:
Effects: Constructs a vector with n copies of value [...]
其中n是第一个参数,值是第二个参数。