std::vector<std::vector 的迭代器有效性<T>>

Iterator validity for std::vector<std::vector<T>>

本文关键字:gt vector lt std 迭代器 有效性      更新时间:2023-10-16

在我的代码中,主要的数据结构是

std::vector<std::vector<T>> Worldlines ;

在我的一个子例程中,我移除元素并将其添加到其中一个组件(比如Worldlines[i](中(可能会导致容器的重新分配具有更多容量(。

如果我在向量Worldlines[i]中有一些T,其位置被我保存为std::vector<T>::iterator对象,那么如果Worldlines[i]被重新分配,它们通常可能会无效。

指向T的迭代器属于具有j != iWorldlines[j]呢?它们是否保证仍然有效,或者其中一个向量的重新分配可能会导致其他向量的重新定位,因为它们被绑定在一个向量中?

谢谢大家。

外部向量的所有迭代器,包括指向元素Worldlines[i]的迭代器都是有效的。您只需更改迭代器指向的对象的值,该值对应于元素Worldlines[i]的位置。矢量没有被重新分配,因为需要重新分配的操作都没有对矢量进行。

此外,向量的所有元素的迭代器也是有效的,除了元素Worldlines[i]本身的迭代者之外,其元素可能被重新分配。

你可以想象这样的情况,就像你有一个指针数组(事实上,向量向量是一个动态分配的指针数组(。如果更改了数组中某个元素的某个指针的值,则不会重新分配数组本身,并且更改后的元素在数组中仍然具有相同的索引。:(

它们将保持有效。

即使vector被重新分配,同一容器中的其他向量也不受影响。

基本上,您可以将矢量映像为:

struct Vector {
    T * begin_of_memory;
    int number_of_allocated_elements;
    int number_of_used_elements;
};

并且迭代器仅仅是CCD_ 13。

当需要调整向量的大小以为新元素留出空间时,begin_of_memory将发生变化,并且当前位于区域中间的任何迭代器也将不再可用。

Vector结构本身只更改了其内容,指向它的指针仍然有效。