C++STL模板筆記(一)

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)來爲實例申請空間,確保在元素個數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章