【问题标题】:How do you initialize a vector of distinct object pointers?你如何初始化不同对象指针的向量?
【发布时间】:2012-10-17 19:15:16
【问题描述】:

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

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

【问题讨论】:

  • 你可以,使用一些std::generate 魔法,但问题是,你为什么要这样做?

标签: c++ pointers vector


【解决方案1】:

你所有的指针都指向同一个位置,所以结果是预期的。

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

【讨论】:

  • 如果满足这些要求,则非常适合 lambda :)
【解决方案2】:

用几个不同的值初始化一个向量需要 C++11 和对初始化列表的支持:

std::vector<Bar*> v { new Bar, new Bar, new Bar, new Bar };

您可能可以在 C++11 之前的版本中使用 Boost.Assign 之类的库。

【讨论】:

  • 是的,但请不要仅仅为此将 Boost 添加到您的应用程序中。 :)
  • @karlphillip,你可能应该添加 Boost :P
  • @mauve 不是真的,当你有std::generate 时。此外,初始化列表是一个想法,但它实际上不适用于更大的数组。想象一个大小为 100 的数组......然后呢?
【解决方案3】:

来自规范:

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

其中 n 是第一个参数,值是第二个参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多