2015-08-08 94 views
2

在我的代码的主数据结构是为标准::矢量迭代有效性<性病::矢量<T>>

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

以我的子程序的一个予删除和添加元素(潜在地导致所述容器的重新分配有更多的能力)到其中一个组件(比如说Worldlines[i])。

如果我有一些T在矢量Worldlines[i]其位置我保存为std::vector<T>::iterator对象,他们可能会普遍地,如果Worldlines[i]被重新分配无效。

迭代器如何指向T属于Worldlines[j]j != i?它们是否保证仍然有效,或者其中一个载体的重新分配可能导致其他载体的重新分配,因为它们受载体向量的约束?

谢谢大家。

+0

我编辑的问题,以避免不同类型的迭代器之间的混淆。 –

回答

2

外部矢量的所有迭代器,包括一个指向元件Worldlines[i]是有效的迭代器。您只是更改了与元素位置相对应的迭代器所指向的对象的值。Worldlines[i]矢量未重新分配,因为无论是否需要重新分配的操作都与矢量一起完成。

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

你能想象这种情况就像你有一个指针数组(其实向量的向量是指针的动态分配的数组)。如果你改变了数组的数组本身不是重新分配和改变元素的元素的一些指针的值仍然有数组中相同的索引。:)

+1

@Vinay Shukla又是什么? –

+0

对不起!评论错误的地方upvoted –

+0

我猜'所有元素的迭代器'的意思是所有迭代器的元素'Worldlines [j]'其中j!= i。 –

2

它们将保持有效。

即使vector是在同一容器中重新分配的其它载体不受影响。

基本上你可以像一个载体实现为:

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

和迭代器作为刚刚T*

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

Vector结构本身只是改变了它的内容和指向它仍然是有效的。

+0

我想这是因为http://stackoverflow.com/questions/19504455/would-vector-of-vectors-be-contiguous中显示的参数和http://stackoverflow.com/questions/10898007/stdvector-of -stdvectors-连续性。我只是想确定一下。谢谢。 –

+0

标准说这(23.3.6.5): 如果没有重新分配发生,插入点之前的所有迭代器和引用保持有效。 –

+0

@VinayShukla这里有什么相关的? “当矢量需要调整大小”意味着重新分配。 – juanchopanza

相关问题