C++STL模板筆記(一)
(這是我本人的理解,如果有什麼問題,歡迎提出問題)
首先,分清楚所謂的侵入式和非侵入式的概念:
- 侵入式容器:容器內放置的內容的固定的幾種;
- 非侵入式容器:容器中放置的內容與容器無關,容器成員對象不必具有特定的基類或者指針域。
有關標準容器最關鍵的思想,就是在所有可能之處都具有邏輯互換性。
這是c++之父在c++書裏說的一句話,STL最重要的就是通用性,邏輯上可以完成大多數要求,在不考慮性能的情況下。
那麼應該在什麼時候選擇什麼樣的模板呢!
\ | [] | 表操作 | 前端操作 | 後端(堆棧)操作 | 迭代器 |
---|---|---|---|---|---|
vector | const | O(n)+ | const+ | Ran | |
list | const | const | const | Bi | |
deque | const | O(n) | const | const | Ran |
stack | const | ||||
queue | cosnt | const | |||
priority_queue | O(log(n)) | O(log(n)) | |||
map | O(log(n)) | O(log(n))+ | Bi | ||
multimap | O(log(n))+ | Bi | |||
set | O(log(n))+ | Bi | |||
mulitset | O(log(n))+ | Bi | |||
string | cosnt | O(n)+ | O(n)+ | const+ | Ran |
array | const | Ran | |||
valarray | const | Ran | |||
bitset | const |
以上是各種標準容器的各種操作的性能(C++程序設計412頁/機械工業出版社/十週年紀念版)
- Ran是隨機讀取迭代器,Bi是雙向迭代器
- 後綴+表示偶爾會有顯著的額外時間開銷
大家如果有興趣,可以根據上面各種操作的時間複雜度猜一猜STL的底層數據結構,以下是信息。
對於Vector,最可能的像一個數組一樣,所以如果要更改它的大小(insert,push_back)是一件很費時間的事情。
vector的使用應該充分考慮後續的空間擴展,所以可以使用vector.reserve(n)來爲實例申請空間,確保在元素個數