deque及迭代器失效問題

deque由一段一段的定量連續空間構成,採用一個表(map)來記錄每個連續空間的首址,map是一小塊連續的空間,目的是便於迭代器的尋址(map+1即可跳轉到下一個連續空間的首址)。map中的每一個元素(node)都是指針,指向另一端(較大的)連續線性空間,稱爲緩衝區,緩衝區纔是deque的儲存空間主體。具體機制如下所示:


其中,對迭代器it的解引用得到的是cur位置處對應的元素。

deque要求map中前後各預留一個node節點,以便擴充時可用。

下面討論插入刪除操作,deque中的迭代器、引用失效問題。

查看deque源碼可知,在push_front/push_back中,由於要滿足以上預留一個節點的要求,若當前map所管理的節點個數不足以擴充時,map需要重分配。如下圖所示:

當前deque中含有23個元素,此時push_back(23),會導致node節點不足,於是引起map的重分配。


原來的迭代器的node指向的map節點被釋放,也就無法找到對應的元素,故原迭代器失效。而由於這個過程中內存並未發生改變,故其他元素的引用、指針仍然有效。push_front同理。

pop_front,pop_back只是簡單的析構元素,必要時(第一個緩衝區、最後一個緩衝區只有一個元素)釋放該緩衝區、調整start、finish迭代器的狀態,所以指向其他元素的迭代器、引用均有效。

除了頭尾兩端,在任何地方插入和刪除元素都將導致內存重新分配,導致指向deque元素的任何pointer、iterator、reference失效。

總結如下

插入

①頭尾:

可能指向其他元素的迭代器失效,但指針、引用仍有效

②其他位置:

指向其他元素的迭代器、指針、引用失效

刪除

①頭尾:

指向其他元素的迭代器、指針、引用仍然有效

②其他位置:

指向其他元素的迭代器、指針、引用失效



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章