我有一个std::vector
包含很多元素。由于向量很大,我将指向某些特定元素的指针存储在另一个向量中,以便能够更快地访问它们。但是随着向量的增长,有时它的内部容器会被重新分配,导致我所有的指针都变得无效。
有没有办法知道这种情况何时发生?这样我可以更新另一个列表中的指针。
你不应该存储指针,你应该存储索引:
即,而不是:
var1 = &vector[0];
var2 = &vector[13];
和访问*var1
,*var2
你应该存储:
i1 = 0;
i2 = 13;
和访问vector[i1]
,vector[i2]
注意:如果您使用修饰符方法,您仍然应该小心:
pop_back()
(这使得最后一个位置无效)erase(i)
(移动所有大于 i 的索引)(你的第一种方法有同样的警告)
也许你应该看看 boost::container::stable_vector: http://www.boost.org/doc/libs/1_51_0/doc/html/boost/container/stable_vector.html
您可以存储指向各个元素的指针,而不是将元素直接存储在大向量中。因此,std::vector<int>
您使用 a 而不是 a std::vector<int *>
。即使向量重新分配其内容,数据本身的地址也不会改变,因此指向它的其他指针将保持有效。但是,这需要您创建输入到向量中的每个元素new
,然后手动delete
删除任何数据。
我道歉,我的评论完全错了。N3337 23.3.6.3 vector capacity paragraph 5
:
备注:重新分配使所有引用序列中元素的引用、指针和迭代器无效。保证在调用之后的插入过程中不会发生重新分配,
reserve()
直到插入会使向量的大小大于 的值capacity()
。