Effective STL 讀書筆記——第1條 慎重選擇容器類型

STL中有迭代器(iterator),算法(algorithm)和函數對象(function object)。其中最值得注意的可能還是容器。容器相比數組更加靈活,它們可以動態增長(和縮減),自己管理內存,可以記住自己包含了多少對象。


STL容器不是簡單的好,而是確實很好。


在第1條款中,我們將簡要介紹下各個容器的特點以及他們特定的使用場景。

首先簡要回顧下c++提供的幾種容器:

  • 標準 STL 序列容器:vector, string, deque, list
  • 標準 STL 關聯容器:set, multiset, map, multimap
  • 非標準序列容器 slist 和 rope
  • 非標準關聯容器 hash_set, hash_multiset, hash_map, hash_multimap
  • vector<char>作爲 string 的替代
  • vector作爲標準關聯容器的替代
  • 幾種標準的非STL容器,包括數組 、bitset、stack、queue等。


對STL容器的一種重要的分類方法,即對連續內存容器基於節點容器的區分。

  • 連續內存分配(也稱基於數組的容器)把它的元素放在一塊或者多塊(動態分配的)內存中,每塊內存中都有多個元素。當有新元素插入或已存在的元素刪除時,同一塊中的其他元素要向前或者向後移動。這種移動影響到效率和異常安全性。其中容器vector, string, deque都屬於此類。
  • 基於節點的容器在每一個(動態分配的)內存塊中只存放一個元素。容器中元素的插入和刪除隻影響到指向節點的指針,而不影響節點本身的內容,當有元素插入或者刪除時,元素的值不需要移動。其中容器list,和所有標準的關聯容器(通常實現方式是平衡樹)都屬於此類。


選擇容器時,我們經常會有以下考慮:

  • 是否需要在容器的任意位置插入新元素?  需要就選擇序列容器,關聯容器是做不到的。
  • 是否關心容器中的元素是排序的? 不關心的話,那麼哈希容器可行,否則應該避免哈希容器。
  • 需要的迭代器類型?  如果必須是隨機訪問迭代器,那麼只能選擇vector, deque, string。
  • 當有元素插入或者刪除時,避免移動容器中原有元素是否重要? 如果是,那就要避免使用連續內存的容器。
  • 元素的查找是否是關鍵的考慮因素? 如果是,則考慮哈希容器、排序的vector、標準關聯容器
  • 等等等

上面這些並沒有覆蓋所有的情形。總之在選擇容器時,除了容器操作的算法複雜性,還有很多需要考慮的因素。也不存在“默認的容器”。



發佈了33 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章