STL容器之size 函式的實現

2021-07-12 05:18:46 字數 1365 閱讀 7804

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...