C STL各容器迭代器種類及使用原因總結

2021-10-12 06:53:45 字數 2099 閱讀 4139

在c++標準庫的所有容器中,stl提供了幾種不同種類的迭代器,每乙個容器都可以用迭代器來遍歷,但是不同容器的內部資料結構是不一樣的,所以實際為了保證最高的迭代效率,stl針對不同容器提供的迭代器是不一樣的,具體有以下幾種:

random_access_iterator(隨機訪問迭代器,可以通過直接偏移量訪問(比如it+5即可訪問it的後面第五個元素))

bidirectional_iterator(雙向迭代器,可以通過++ --操作訪問前後元素)

forward_iterator(單向迭代器,可以通過++訪問下一元素)

input_iterator(輸入迭代器)

output_iterator(輸出迭代器)

random_access_iterator:

1.std::array由於陣列是連續空間,可以根據頭指標偏移量來直接定址

2.std::vector動態陣列容器由於是連續空間,類似陣列,所以也可以根據頭指標偏移量來直接定址

3.std::deque雙向佇列的內部實現其實是通過多個連續空間拼接而成的,所以也可以直接定址

bidirectional_iterator

1.std::list列表的內部實現是雙向鍊錶,不是連續空間,因此只能使用指標逐一迭代間接定址

2.std::set/std::multiset集合的內部實現是紅黑樹,紅黑樹是低度平衡二叉搜尋樹,紅黑樹的節點結構如下

struct __rb_tree_node_base

每個節點儲存了父節點和左右子節點的指標,所以可以通過指標逐一間接定址

3.std::map//std::multimap表的內部實現也是紅黑樹,理由同上

forward_iterator

1.std::unordered_set/std::unordered_multiset無序集合(雜湊集合)的內部實現是hashtable,hashtable是通過連續空間下的buckets(通常用vector實現)來雜湊儲存元素,雖然是連續空間,但是實際上unordered容器的實現,每個bucket(node)的結構是這樣的

template

<

class

value

>

struct __hashtable_node

val是bucket中的元素,next用於指向下乙個node。這樣設計的原因是解決hash衝突,這樣衝突的元素會放在這樣的一條單向鍊錶中,所以實際上每乙個bucket中的元素只能從前往後迭代,無法向前迭代

2.std::unordered_map/std::unordered_multimap無序表(雜湊表)的內部實現也是hashtable,同理

3.std::forward_list單向列表的內部實現為單向鍊錶,只支援單向迭代

input_iterator與output_iterator這兩種迭代器較為特殊,用得很少,具體目的用於指向流,來讀取或流中的資料(若ostream_iterator(屬於output_iterator)指向cout,那麼即可向cout這個ostream寫值,實現輸出的效果)

各種迭代器的效率不同,random_access_iterator>bidirectional_iterator>forward_iterator

各種迭代器的能力不同,stl中由上而下有如下的繼承關係

input_iterator → forward_iterator → bidirectional_iterator → random_access_iterator

但output_iterator和上述沒有繼承關係

C STL 迭代器 容器 演算法

stl standardtemplatelibrary 即標準模板庫,是乙個具有工業強度的,高效的c 程式庫。它被容納於c 標準程式庫 c standardlibrary 中。該庫包含了諸多在電腦科學領域裡所常用的基本資料結構和基本演算法。為廣大c 程式設計師們提供了乙個可擴充套件的應用框架,高度體...

C STL容器迭代器失效 筆記

迭代器是封裝了指標 過載了 等操作符的類模板,具有類似指標的行為。迭代器的設計是對資料結構的泛化,使不同容器具有相同的訪問方式,讓 不必依賴於特定的資料結構。指標也可以狹義的理解為迭代器。在c 中經常使用迭代器對stl容器進行操作,但很多同學沒怎麼關注過迭代器失效的問題。迭代器失效,指迭代器指向錯誤...

C STL常用容器總結之一 容器與迭代器

3 本博文僅作學術交流只用,無任何其他用途。言歸正傳,下面開始介紹c 中的stl容器。standard template library,標準模板庫。所謂stl容器,就是將最常用的一些資料結構實現出來。常用的資料結構不外乎陣列array 鍊錶list 樹tree 堆疊stack 佇列queue 雜湊...