如何初始化不同对象指针的向量?

时间:2012-10-17 19:15:17

标签: c++ pointers vector

我想看看我是否可以在一行中初始化一个对象向量,所以我写了下面的例子:

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()。是否可以初始化对象指针的向量以指向不同的对象?

3 个答案:

答案 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是第一个参数,值是第二个参数。