0

我有一段代码,我首先将一些值放入 a 中std::vector,然后将它们中的每一个的地址提供给将使用它们的对象之一,如下所示:

std::vector < useSomeObject > uso;

// uso is filled

std::vector < someObject > obj;

for (int i=0; i < numberOfDesiredObjects; ++i){
    obj.push_back(someObject());
    obj.back().fillWithData();
}
for (int i=0; i < numberOfDesiredObjects; ++i){
    uso[i].setSomeObject(&obj[i]);
}

// use objects via uso vector
// deallocate everything

现在,由于我有时有点风格怪胎,我认为这很丑陋,并且只想使用 1 个 for 循环,有点像这样:

for (int i=0; i < numberOfDesiredObjects; ++i){
    obj.push_back(someObject());
    obj.back().fillWithData();
    uso[i].setSomeObject(&obj.back());
}

当然,我不能这样做,因为偶尔会发生重新分配,并且我设置的所有指针都变得无效。

所以,我的问题是: 我知道std::vector.reserve()如果你知道你需要多少并且想要提前分配内存,那么我知道这是要走的路。如果我确保我正在尝试提前分配足够的内存reserve()这是否保证我的指针将保持有效?

谢谢你。


边注。 是一个类似的问题,但没有我想知道的答案。只是为了防止它作为对该问题的第一条评论弹出。

4

2 回答 2

5

事实上,这是使用reserve. std::vector只要向量的新大小不超过旧容量,您就可以保证追加到 an 的末尾不会使迭代器、引用或指向向量中元素的指针无效。

于 2012-05-24T09:58:32.190 回答
4

如果我确保我正在尝试使用 reserve() 提前分配足够的内存,这是否保证我的指针将保持有效?

是的,它保证您的指针将保持有效,除非:

  • 大小增加超出当前容量
  • 除非,你删除任何你没有的元素。

向量的迭代器无效规则在23.2.4.3/123.2.4.3/3中指定为:

插入点之前的所有迭代器和引用都不受影响,除非新容器大小大于之前的容量(在这种情况下,所有迭代器和引用都无效)

擦除点之后的每个迭代器和引用都无效。

于 2012-05-24T09:58:26.567 回答