慎重選擇容器型別

2021-07-05 18:43:21 字數 1673 閱讀 8763

一、容器分類

(1)標準的stl序列容器

vector、string、deque和list。
(2) 標準的stl關聯容器

set、multiset、map和multimap
(3)非標準序列容器

slist和rope。
(4)非標準的關聯容器

hash_set、hash_multiset、hash_map和hash_multimap。
(5)幾種標準的非stl容器

陣列、bitset、valarray、stack、queue和priority_queue。
二、容器的選擇

(1)你是否需要在容器的任意位置插入新元素?

如果需要,就選擇序列容器;關聯容器是不行的。

(2) 你是否關心容器中的元素是如何排序的?

如果不關心,則雜湊容器是乙個可行的選擇方案;否則,你要避免雜湊容器。

(3)你選擇的容器必須是標準c++的一部分嗎?

如果必須是,就排除了雜湊容器、slist和rope。

(4)你需要哪種型別的迭代器?

如果它們必須是隨機訪問迭代器,則對容器的選擇就被限定為vector、deque和string。或許你也可以考慮rope。如果要求使用雙向迭代器,那麼你必須避免slist以及雜湊容器的乙個常見實現。

(5)當發生元素的插入或刪除操作時,避免移動容器中原來的元素是否很重要?

如果是,就要避免連續記憶體的容器。

(6)容器中的資料的布局是否需要和c相容?

如果需要相容,就只能選擇vector容器。

(7)元素的查詢速度是否關鍵的考慮因素?

如果是,就要考慮雜湊容器,排序的vector,和標準關聯容器 — 或許這就是優先順序。

(8)如果容器內部使用了引用計數技術(reference counting),你是否介意?

如果是,就要避免使用string,因為許多string的實現都是用了引用計數。rope也需要避免,因為權威的rope實現是基於引用計數的。當然,你需要某種表示字串的方法,可以考慮vector。

(9)對插入和刪除操作,你需要事務語義(transactional semantics)嗎?也就是說在插入和刪除操作失敗時,你需要回滾的能力嗎?

如果需要,你就要使用基於節點的容器。如果對多個元素的插入操作需要事務語義,則你需要選擇list,因為在標準容器中,只有list對多個元素的插入操作提供了事務語義。

(10)你需要使迭代器、指標和引用變為無效的次數最少嗎?

如果是這樣,就要使用基於節點的容器,因為對這類容器的插入和刪除操作從來不會使迭代器、指標和引用變為無效(除非它們指向了乙個你正在刪除的元素)。而針對連續記憶體容器的插入和刪除操作一般會使指向該容器的迭代器、指標和引用變為無效。

(11) 如果序列容器的迭代器是隨機訪問迭代器型別,而且只要沒有刪除操作發生,且插入操作只發生在容器的末尾,則指向資料的指標和引用就不會變為無效,這樣的容器是否對你有幫助?

這是非常特殊的情況,但如果你面對的情形正是如此,則deque是你所希望的容器。(有意思的是,當插入操作僅在容器末尾發生時,deque的迭代器有可能變為無效。deque是唯一的迭代器可能會變為無效而指標和引用不會變為無效的stl標準容器。

參考:effective stl

慎重選擇容器型別

慎重選擇容器型別 一 回顧c 提供的容器 標準的stl序列容器 vector string deque和list。標準的stl關聯容器 set multiset map和multimap。非標準序列容器 slist 和rope。非標準的關聯容器 hash set hash multiset hash...

慎重選擇容器型別

慎重選擇容器型別 一 回顧c 提供的容器 標準的stl序列容器 vector string deque和list。標準的stl關聯容器 set multiset map和multimap。非標準序列容器 slist 和rope。非標準的關聯容器 hash set hash multiset hash...

第一條 慎重選擇容器型別

1.標準stl序列容器 vector,string,deque,list 2.標準stl關聯容器 set,multiset,map,multimap 3.非標準序列容器 slist,rope slist是乙個單向鍊錶,rope本質上是乙個 重型 string 4.非標準的關聯容器 hash set,...