2

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

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

4

3 回答 3

3

您的所有指针都指向同一个位置,因此结果是预期的。

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
于 2012-10-17T19:16:07.847 回答
1

用几个不同的值初始化一个向量需要 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.

于 2012-10-17T19:18:12.217 回答
0

From the spec:

Effects: Constructs a vector with n copies of value [...]

where n is the first and value the second argument.

于 2012-10-17T19:23:14.130 回答