vector o(1)
list o(n)
deque
以下**:
以下是**片段:
class vector
iterator begin()
iterator end()
protected:
_tp* _m_start;
_tp* _m_finish;
_tp* _m_end_of_storage; };
可見,vector的size()實現在時間複雜度上確實是常量級的,很簡單很快,就如我們想像中一樣。注意它沒有乙個_size。
再看list:
以下是**片段:
class list };
注意了,盡然不是我們想象的。既不同於vector實現,也沒有乙個_size, 而是呼叫的乙個全域性函式:
標頭檔案stl_iterator_base.h:
以下是**片段:
template
inline void distance(_inputiterator __first, _inputiterator __last, _distance& __n)
template
inline void __distance(_inputiterator __first, _inputiterator __last, _distance& __n, input_iterator_tag) }
大家看到了吧,它竟然使用迭代器遍歷了整個鍊錶,那麼size()在時間複雜度上就不再是我們想象中的常量級,而是o(n)。為什麼這樣呢,這要對iterator和traits有所了解,才明白這麼做的必要性。
所以,如果你的list裡資料很多,而你每次操作前還要呼叫size()來看看是否超過你的最大數目,那執行速度比你想象中要慢很多。所以處理這種情況,如果你必須每次要看看它的元素數目,把list
包裝一下,自己維護乙個_size算了,也浪費不了多少記憶體,4位元組嘛。
最後看看deque:
以下是**片段:
class deque
protected:
iterator _m_start;
iterator _m_finish; };
不錯,看起來和vector一樣,其實不然。
別忘了c++語法有乙個重要概念:運算子過載。
以下是**片段:
struct _deque_iterator };
為什麼這麼複雜了?這要怪deque採用map作為主控,使用分段連續線性空間的設計。怎麼說都比list那個實現快。
可以說stl的**風格是讓人難受的,當我們無聊而心情又好的時候,讀讀侯捷的《stl原始碼剖析》吧,分析對比一下,也有一些樂趣。
STL容器中size和capacity的區別
size 表示當前容器中元素的個數 capacity 表示當前容器在必須分配新的儲存空間之前允許存放元素的個數 與size對應的函式是resize n 它的作用是調整容器的大小使其能夠容納n個元素,如果n小於當前容器的size,則刪除多餘的元素。如果n大於當前容器的size,則新增初始化後的元素。r...
STL之list容器的實現框架
list的底層採用資料結構是環形的雙向鍊錶。相對於vector容器。list容器插入和刪除操作付出的代價要比vector容器小得多,可是list帶有鍊錶的天生弱點。就是不支援隨機訪問。從內建的迭代器角度分析。vector容器相應的迭代器為隨機訪問迭代器,而list容器內建的迭代器則為雙向迭代器。我們...
stl容器之順序容器
stl容器分為順序容器和關聯容器 其中順序容器最常用的由vector,list,queue 1.vector vector 向量容器,可以看作變長陣列,長度可根據需要自行變化。使用的標頭檔案 include 定義方式 vector陣列名 vectorar 訪問容器內資料的方式和普通陣列相同,可以用a...