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失效。
總結如下:
插入
①頭尾:
可能指向其他元素的迭代器失效,但指針、引用仍有效
②其他位置:
指向其他元素的迭代器、指針、引用失效
刪除
①頭尾:
指向其他元素的迭代器、指針、引用仍然有效
②其他位置:
指向其他元素的迭代器、指針、引用失效