Effective_STL 學習筆記(一)仔細選擇你的容器
本章關注的是可以適合所有STL容器的指導方針:
選擇適當容器時應該面對的約束;
避免產生為一個容器型別寫的程式碼也可以用於其他容器型別的錯覺;
容器裡物件拷貝操作的重要性;
當指標或auto_ptr存放在容器中時出現的難點;
刪除輸入和輸出;
可不可以使用自定義分配器;
達到最高效率的技巧和考慮在多執行緒環境下容器的使用
C++容器回顧:
標準STL序列容器:vector、string、deque和list;
標準STL關聯容器:set、multiset、map和multimap;
非標準容器序列slist和rope。slist是一個單向連結串列,rope本質是一個重型字串;
非標註關聯容器:hash_set、hash_multiset、hash_map和hash_multimap;
vector<char> 可以作為string的替代品;
vector 作為標準關聯容器的替代品;
幾種標準非STL容器:陣列、bitset、valarray、stack、queue和priority_queue
vector、deque 和 list 之間做選擇的指導方案:
根據複雜度,vector 是一種可以預設使用的序列型別;
當頻繁的對序列中部進行插入和刪除時應該使用 list;
當大部分插入和刪除發生在序列的頭部和尾部時可以選擇 deque;
連續記憶體容器和基於節點的容器的區別:
連續記憶體容器(也叫作基於陣列的容器)在一個或多個(動態分配)的記憶體塊中儲存他們的元素:
vector、string 和 deque
基於節點的容器在每個記憶體塊(動態分配)中只儲存一個元素:
list 和 slist,所有標準關聯容器也是(典型實現是平衡樹)
大多數關於容器間選擇問題:
1. 可以在容器的任意位置插入一個新元素,則需要序列容器,關聯容器做不到;
2. 不關心元素在容器中的順序,雜湊容器可行,否則避免使用雜湊容器;
3. 必須使用C++標準容器時,可以除去雜湊容器、slist 和 rope;
4. 考慮迭代器,如果必須是隨機訪問迭代器,只限於 vector、deque 和 string,也可考慮 rope;
5. 當插入和刪除資料時,如果非常在意容器內的元素移動,則放棄使用記憶體連續容器;
6. 容器中的資料的記憶體需要相容 C 時,只能使用 vector;
7. 查詢速度很重要時,多考慮雜湊容器,排序的 vector 和標準的關聯容器;
8. 如果介意容器底層使用引用計數,則避開 string、rope,可以考慮使用 vector<char>;
9. 如果需要插入和刪除的事務性語義,則需要使用基於節點的容器,list 是唯一提供多元素插入事務性語義的標準容器;
10. 如果需要把迭代器、指標和引用的失效次數減到最少,使用基於節點的額容器;
11. 可以隨機訪問迭代器,只要沒有刪除且插入只發生在容器的結尾,使用 deque;