簡體   English   中英

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

[英]Iterator validity for std::vector<std::vector<T>>

在我的代碼中,主要數據結構是

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

在我的一個子例程中,我刪除了一個元素並添加了元素(可能導致容器的重新分配,使其具有更大的容量)(假設為Worldlines[i] )。

如果我在向量Worldlines[i]有一些T ,並且我將其位置另存為std::vector<T>::iterator對象,則在重新分配Worldlines[i] ,它們通常可能無效。

指向Worldlines[j] j != i Worldlines[j]T迭代器呢j != i 是否保證它們仍然有效,或者由於其中一個向量的綁定在向量的向量中,所以其中一個向量的重新分配可能導致其他向量的重新分配?

感謝大家。

它們將保持有效。

即使一個vector是在同一容器中重新分配的其它載體不受影響。

基本上,您可以將向量成像為:

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

迭代器只是T*

當需要調整向量的大小以為新元素騰出空間時, begin_of_memory當然會更改,並且當前位於該區域中間的任何迭代器也將不再可用。

但是Vector結構本身僅更改了其內容,並且指向它的指針仍然有效。

外部向量的所有迭代器(包括指向元素Worldlines[i]的迭代器Worldlines[i]均有效。 您只需更改迭代器指向的與對象Worldlines[i]的位置相對應的對象的值,就不會重新分配向量,因為沒有對向量進行任何需要重新分配的操作。

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

您可以想象這種情況,就像您擁有一個指針數組(實際上,向量的向量是動態分配的指針數組)。 如果您更改了數組元素的某些指針的值,則數組本身不會被重新分配,並且更改后的元素在數組中仍具有相同的索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM