1. 程式人生 > >【C++】STL常用容器總結之十一:容器小結

【C++】STL常用容器總結之十一:容器小結

12、容器小結

1、容器的選用

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

2、容器的比較

  • Vector:連續的空間儲存,可以使用[ ]操作符。Vector可以快速訪問隨機的元素,快速的在末尾插入元素,但是在序列中間隨機的插入、刪除元素要慢,而且如果一開始分配的空間不夠的話,有一個重新分配更大空間,然後拷貝的效能開銷。
  • Deque:小片的連續,小片間用連結串列相連,實際上內部有一個map的指標,因為知道型別,所以還是可以使用[ ],只是速度沒有vector快。Deque可以快速訪問隨機的元素,快速的在開始和末尾插入元素,隨機的插入、刪除元素要慢,空間的重新分配要比vector快,重新分配空間後,原有的元素不需要拷貝。對deque的排序操作,可將deque先複製到vector,排序後再複製回deque。
  • List:每個元素間用連結串列相連。訪問隨機元素不如vector快,隨機的插入元素比vector快,對每個元素都分配空間,所以不存在空間不夠,重新分配的情況。
  • Set:內部元素唯一,用一棵平衡樹結構來儲存,因此遍歷的時候就排序了,查詢也比較快。
  • Map:一對一的對映的結合,key不能重複。
  • Stack:介面卡,必須結合其他的容器使用,STL中預設的內部容器是deque。先進後出,只有一個出口,不允許遍歷。
  • Queue:是受限制的deque,內部容器一般使用list較簡單。先進先出,不允許遍歷。
  • Priority_queue:插入的元素有優先順序順序,top出來的元素是優先順序最高的。
    容器比較

3、容器的選用法則

  • 如果程式要求隨機訪問元素,則應使用vector或deque容器。
  • 如果程式必須在容器的中間位置插入或刪除元素,則應採用list容器。
  • 如果程式不是在容器的中間位置,而是在容器首部或尾部插入或刪除元素,則應採用deque容器。
  • 如果只需要在讀取輸入時在容器的中間位置插入元素,然後需要隨機訪問元素,則可以在輸入時將元素讀入到一個list容器中,然後對容器排序,再將排序後的list容器複製到vector容器中。
  • 如果程式既需要隨機訪問,又需要在容器的中間位置插入或刪除元素,此時應當權衡哪種操作的影響較大,從而決定選擇list容器還是vector或deque容器。注:此時若選擇使用vector或deque容器,可以考慮只使用它們和list容器所共有的操作,比如使用迭代器而不是下標,避免隨機訪問元素等,這樣在必要時,可以很方便地將程式改寫為使用list容器。

4、隨便說說容器

我們在學習容器的時候,首先需要掌握的是容器的原理:某種容器採用什麼底層資料結構實現、某種容器適合什麼樣的操作、某種容器的一些常用操作函式等等。然後,在遇到具體的問題時,我們可以根據需求選擇合適的容器,完成需要執行的功能。

結語

容器的大部分內容已經介紹完了。如果大家想進一步瞭解STL的使用,可以閱讀上文給出的兩本書籍,當然最好的學習方法是實踐,具體的練習有助於更好的理解。

PS

如果大家發現什麼問題,請聯絡博主就行修正,謝謝!