STL容器學習總結
阿新 • • 發佈:2018-12-21
vector和deque容器提供了對元素的快速訪問,但付出的代價是,在容器的任意位置插入或刪除元素,比在容器尾部插入和刪除的開銷更大,因為要保證其連續儲存,需要移動元素;list型別在任何位置都能快速插入和刪除,因為不需要保證連續儲存,但付出的代價是元素的隨機訪問開銷較大。特徵如下: 1)與vector容器一樣,在deque容器的中間insert或erase元素效率比較低; 2)不同於vector容器,deque容器提供高效地在其首部實現insert和erase的操作,就像在尾部一樣; 3)與vector容器一樣而不同於list容器的是,deque容器支援對所有元素的隨機訪問。 4)在deque容器首部或尾部刪除元素則只會使指向被刪除元素的迭代器失效。在deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器都失效。 容器的比較:
佇列和優先順序佇列 標準庫佇列使用了先進先出(FIFO)的儲存和檢索策略,進入佇列的元素被放置在尾部,下一個被取出的元素則取自佇列的首部。 priority_queue預設使用元素型別的 < 操作符來確定它們之間的優先順序關係,使用者也可以定義自己的優先順序關係。在優先順序佇列中,新元素被放置在比它優先順序低的元素的前面。
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 專門進行數值計算的,增加特殊的數學函式。
s.empty() | 如果棧為這人,則true;否則返回false |
s.size() | 返回棧中元素的個數 |
s.pop() | 刪除棧頂元素,但不返回其值 |
s.top() | 返回棧頂元素的值,但不刪除該元素 |
s.push(item) | 在棧項壓入新元素 |
q.empty() | 如果佇列為空,則返回true;否則返回false |
q.size() | 返回佇列中元素的個數 |
q.pop() | 刪除隊首元素,但不返回其值 |
q.front() | 返回隊首元素的值,但不刪除該元素 (注:該操作只適用於佇列) |
q.back() | 返回隊尾元素的值,但不刪除該元素 (注:該操作只適用於佇列) |
q.top() | 返回具有最高優先順序的元素值,但不刪除該元素 (注:該操作只適用於優先順序佇列。MSDN也為queue提供了該操作) |
q.push(item) | 對於queue,在隊尾壓入一個新元素; 對於priority_queue,在基於優先順序的適當位置插入新元素 |