deque 添加刪除元素 迭代器失效問題
deque的儲存空間主體在緩衝區buffer中,由一段一段的定量連續空間組成。爲了便於迭代器的尋址,除了此儲存空間,deque採用一個表(map)來記錄每個連續空間的首地址。map是一小塊連續的空間,每個元素(node)都是指針,指向buffer中的各首地址。
指向deque中某元素的迭代器iterator實際結構如圖所示,first和last分別指向buffer中本段連續空間的首尾元素,cur指向iterator解引用得到的元素,node指向map中對應的node。
==需要注意的是,deque要求map前後要各預留一個node節點,以便擴充可用。==
插入元素
- 頭尾
可能使指向其他元素的迭代器失效(buffer中一段連續空間滿,需重新分配內存和map時),但指針、引用仍有效 - 其他位置
迭代器、指針、引用失效
刪除元素
- 頭尾
指向其他元素的迭代器、指針、引用仍然有效 - 其他位置
迭代器、指針、引用失效
在deque中push_back插入元素的例子
對deque push_back(23),buffer需添加一段新的連續內存空間,因此map的node節點不夠用,map被釋放,對map重新分配存儲空間爲new_map。所有iterator的node指向原map,因此iterator均失效。但buffer的原有空間並未發生改變,因此其他元素的引用、指針仍然有效。