3

我有一个std::vector包含很多元素。由于向量很大,我将指向某些特定元素的指针存储在另一个向量中,以便能够更快地访问它们。但是随着向量的增长,有时它的内部容器会被重新分配,导致我所有的指针都变得无效。

有没有办法知道这种情况何时发生?这样我可以更新另一个列表中的指针。

4

4 回答 4

6

你不应该存储指针,你应该存储索引:

即,而不是:

var1 = &vector[0];
var2 = &vector[13];

和访问*var1*var2

你应该存储:

i1 = 0;
i2 = 13;

和访问vector[i1]vector[i2]


注意:如果您使用修饰符方法,您仍然应该小心:

  • pop_back()(这使得最后一个位置无效)
  • erase(i)(移动所有大于 i 的索引)
  • ETC ...

(你的第一种方法有同样的警告)

于 2012-10-01T14:12:19.527 回答
4

也许你应该看看 boost::container::stable_vector: http://www.boost.org/doc/libs/1_51_0/doc/html/boost/container/stable_vector.html

于 2012-10-01T14:08:59.610 回答
1

您可以存储指向各个元素的指针,而不是将元素直接存储在大向量中。因此,std::vector<int>您使用 a 而不是 a std::vector<int *>。即使向量重新分配其内容,数据本身的地址也不会改变,因此指向它的其他指针将保持有效。但是,这需要您创建输入到向量中的每个元素new,然后手动delete删除任何数据。

于 2012-10-01T14:07:09.490 回答
0

我道歉,我的评论完全错了。N3337 23.3.6.3 vector capacity paragraph 5

备注:重新分配使所有引用序列中元素的引用、指针和迭代器无效。保证在调用之后的插入过程中不会发生重新分配,reserve()直到插入会使向量的大小大于 的值capacity()

于 2012-10-01T14:09:22.583 回答