1. 程式人生 > >STL容器學習總結

STL容器學習總結

vector和deque容器提供了對元素的快速訪問,但付出的代價是,在容器的任意位置插入或刪除元素,比在容器尾部插入和刪除的開銷更大,因為要保證其連續儲存,需要移動元素;list型別在任何位置都能快速插入和刪除,因為不需要保證連續儲存,但付出的代價是元素的隨機訪問開銷較大。特徵如下:   1)與vector容器一樣,在deque容器的中間insert或erase元素效率比較低;   2)不同於vector容器,deque容器提供高效地在其首部實現insert和erase的操作,就像在尾部一樣;   3)與vector容器一樣而不同於list容器的是,deque容器支援對所有元素的隨機訪問。   4)在deque容器首部或尾部刪除元素則只會使指向被刪除元素的迭代器失效。在deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器都失效。
 容器的比較:

vector (連續的空間儲存,可以使用[]操作符)快速的訪問隨機的元素,快速的在末尾插入元素,但是在序列中間歲間的插入,刪除元素要慢,而且如果一開始分配的空間不夠的話,有一個重新分配更大空間,然後拷貝的效能開銷。deque (小片的連續,小片間用連結串列相連,實際上內部有一個map的指標,因為知道型別,所以還是可以使用[],只是速度沒有vector快)快速的訪問隨機的元素,快速的在開始和末尾插入元素,隨機的插入,刪除元素要慢,空間的重新分配要比vector快,重新分配空間後,原有的元素不需要拷貝。對deque的排序操作,可將deque先複製到vector,排序後在複製回deque。list

 (每個元素間用連結串列相連)訪問隨機元素不如vector快,隨機的插入元素比vector快,對每個元素分配空間,所以不存在空間不夠,重新分配的情況。

set:內部元素唯一,用一棵平衡樹結構來儲存,因此遍歷的時候就排序了,查詢也比較快的哦。map :一對一的對映的結合,key不能重複。

stack :介面卡,必須結合其他的容器使用,stl中預設的內部容器是deque。先進後出,只有一個出口,不允許遍歷。queue: 是受限制的deque,內部容器一般使用list較簡單。先進先出,不允許遍歷。vector<bool> 與bitset<> ,前面的可以動態改變長度。priority_queue: 插入的元素就有優先順序順序,top出來的就是優先順序最高的了valarray 專門進行數值計算的,增加特殊的數學函式。

   一些容器選用法則:   1)如果程式要求隨機訪問元素,則應使用vector或deque容器;   2)如果程式必須在容器的中間位置插入或刪除元素,則應採用list容器;   3)如果程式不是在容器的中間位置,而是在容器首部或尾部插入或刪除元素,則應採用deque容器;   4)如果只需要在讀取輸入時在容器的中間位置插入元素,然後需要隨機訪問元素,則可以在輸入時將元素讀入到一個list容器中,然後對容器排序,再將排序後的list容器複製到vector容器中。   5)如果程式既需要隨機訪問,又需要在容器的中間位置插入或刪除元素,此時應當權衡哪種操作的影響較大,從而決定選擇list容器還是vector或deque容器。注:此時若選擇使用vector或deque容器,可以考慮只使用它們和list容器所共有的操作,比如使用迭代器而不是下標,避免隨機訪問元素等,這樣在必要時,可以很方便地將程式改寫為使用list容器。容器介面卡     介面卡(adaptor)是標準庫中通用的概念,包括容器介面卡、迭代器介面卡和函式介面卡。本質上,介面卡是使一事物的行為類似於另一事物的行為的一種機制。容器介面卡讓一種已存在的容器型別採用另一種不同的抽象型別的工作方式實現,只是發生了介面轉換而已。     標準庫提供了三種順序容器介面卡:queue, priority_queue和stack。     所有介面卡都定義了兩個建構函式:預設建構函式用於建立空物件,而帶一個容器引數的建構函式將引數容器的副本作為其基礎值。     預設的stack和queue都基於deque容器實現,而priority_queue則在vector容器上實現。在建立介面卡時,通過將一個順序容器指定為介面卡的第二個型別引數,可覆蓋其關聯的基礎容器型別。例如:    stack<int, vector<int> > int_stack;  // 此時,int-stack棧是基於vector實現    對於給定的介面卡,其關聯的容器必須滿足一定的約束條件。stack介面卡所關聯的基本容器可以是任意一種順序容器型別,因為這些容器型別都提供了push_back、pop_back和back操作;queue介面卡要求其關聯的基礎容器必須提供pop_front操作,因此其不能建立在vector容器上;priority_queue介面卡要求提供隨機訪問功能,因此不能建立在list容器上。   兩個相同型別的介面卡可以做==, !=, <, >, <=, >=這些關係運算,只要其基本元素型別支援==和<兩個操作即可。這與容器大小比較原則一致。這與容器大小比較原則一致。
 s.empty() 如果棧為這人,則true;否則返回false
 s.size() 返回棧中元素的個數
 s.pop() 刪除棧頂元素,但不返回其值
 s.top() 返回棧頂元素的值,但不刪除該元素
 s.push(item) 在棧項壓入新元素
佇列和優先順序佇列   標準庫佇列使用了先進先出(FIFO)的儲存和檢索策略,進入佇列的元素被放置在尾部,下一個被取出的元素則取自佇列的首部。   priority_queue預設使用元素型別的 < 操作符來確定它們之間的優先順序關係,使用者也可以定義自己的優先順序關係。在優先順序佇列中,新元素被放置在比它優先順序低的元素的前面。
 q.empty() 如果佇列為空,則返回true;否則返回false
 q.size() 返回佇列中元素的個數
 q.pop() 刪除隊首元素,但不返回其值
 q.front() 返回隊首元素的值,但不刪除該元素 (注:該操作只適用於佇列
 q.back() 返回隊尾元素的值,但不刪除該元素 (注:該操作只適用於佇列
 q.top()

 返回具有最高優先順序的元素值,但不刪除該元素 (注:該操作只適用於優先順序佇列。MSDN也為queue提供了該操作

 q.push(item) 對於queue,在隊尾壓入一個新元素; 對於priority_queue,在基於優先順序的適當位置插入新元素