std :: vector <std :: vector <t>的迭代器有效性&gt;

时间:2015-08-08 10:39:05

标签: c++ vector stl iterator

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

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

在我的一个子例程中,我删除并添加元素(可能导致容器重新分配以获得更多容量)到其中一个组件(假设为Worldlines[i])。

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

指向属于T的{​​{1}}和Worldlines[j]的迭代器怎么办?它们是否保证仍然有效,或者其中一个向量的重新分配可能导致其他向量的重新分配,因为它们被绑定在向量向量中?

谢谢大家。

2 个答案:

答案 0 :(得分:2)

它们仍然有效。

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

基本上,您可以将实现的矢量成像为:

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

和迭代器只是T*

当向量需要调整大小以便为新元素腾出空间时,begin_of_memory将会改变,并且当前位于该区域中间的任何迭代器都将无法再使用。

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

答案 1 :(得分:2)

外部向量的所有迭代器(包括指向元素Worldlines[i]的迭代器)都是有效的。您只需更改迭代器指向的对象的值,该对象与元素Worldlines[i]的位置相对应。向量未重新分配,因为任何需要重新分配的操作都不是使用向量完成的。

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

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