在我的代码中,主要数据结构是
std::vector<std::vector<T>> Worldlines ;
在我的一个子例程中,我删除并添加元素(可能导致容器重新分配以获得更多容量)到其中一个组件(假设为Worldlines[i]
)。
如果我在向量T
中有一些Worldlines[i]
,其位置我保存为std::vector<T>::iterator
个对象,那么如果重新分配Worldlines[i]
,它们通常可能会失效。
指向属于T
的{{1}}和Worldlines[j]
的迭代器怎么办?它们是否保证仍然有效,或者其中一个向量的重新分配可能导致其他向量的重新分配,因为它们被绑定在向量向量中?
谢谢大家。
答案 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]
本身的元素的迭代器可以重新分配。
你可以想象你有一个指针数组的情况(事实上,向量向量是一个动态分配的指针数组)。如果更改了数组元素的某个指针的值,则不会重新分配数组本身,并且更改的元素在数组中仍具有相同的索引。:)