1. 程式人生 > >STL學習筆記——序列式容器(一級容器)

STL學習筆記——序列式容器(一級容器)

序列式容器線性結構,儲存了元素操作時的邏輯順序
    array//C++內建
    vector
       heap//以演算法形式呈現(***_heap)
         priority_queue
    list
    slist
    deque
      stack//介面卡
      queue//介面卡

1.vector
    1)vector的實現技術,關鍵在於對其大小的控制以及重新配置時的資料移動效率。(配置新空間/資料移動/釋放舊空間
    2)vector維護的是一個連續線性空間,因此普通指標可以作為vector的迭代器。vector支援隨機存取,所以vector提供的是Random Access Iterator。
    3)增加新元素時,如果超過了當時的容量,則會重新分配一塊大小為原來容量兩倍
的記憶體,
  前半段放置原來的元素,後半段放置新增的元素。若容量仍不足,就擴張至足夠大的空間。並且釋放原來的舊空間。
    4)對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就都失效了。
2.list

    1)list每次插入或刪除一個元素,就配置或釋放一個元素空間。
    2)list的結點不保證空間連續,所以普通指標不可以作為vector的迭代器,要重新設計。
    3)list是一個環狀雙向連結串列,迭代器要前後移動,所以list提供的是Bidirectional iterator。
    4)插入操作和接合操作不會引起list迭代器的失效,刪除操作隻影響指向被刪除元素的那個迭代器,其它迭代器不受影響

    5)list的迭代器內包含一個結點指標,用來指向list的結點。list的內部有一個指向空白結點的結點指標,可以用來初始化迭代器內的結點指標。
              iterator begin() { return (link_type) ((*node).next); }
              iterator end() { return node; }
3.deque
    1)deque是動態的以分段連續的空間組合而成,隨時可以增加一段新的空間並連線起來;沒有所謂容量概念,沒有必要提供空間保留的功能;
    2)deque允許常數時間內對頭端進行元素的插入和刪除操作;
    3)deque內部維護一個指向map的指標,map是塊連續空間,裡面的每個元素都是一個指標,指向一個緩衝區,緩衝區真正儲存元素

  map預設的最少結點個數為8,並且結點的使用由中間向兩邊擴充套件
  deque iterator包含一個指向map的指標,同時包含三個分別指向緩衝區當前以及頭尾的指標
  iterator通過設定新的指向map的指標來實現移動
    4)當map的結點數不夠時,需要重新分配新的空間給map,並且需要copy原來的資料,釋放原來的空間
    5)對deque進行的排序操作,為了最高效率,可將deque先完整複製到一個vector,將vector排序後,再複製回deque。