如何知道何时重新分配向量的内部数组

How to know when a vector’s internal array is reallocated?

本文关键字:向量 内部 数组 分配 何知道 何时重 新分配      更新时间:2023-10-16

我有一个包含很多元素的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 *>而不是std::vector<int>。即使向量重新分配其内容,数据本身的地址也不会更改,因此指向它的其他指针将保持有效。但是,这要求您使用 new 创建输入到向量中的每个元素,然后手动delete任何被删除的数据。

我很

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

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