C 標準庫(STL)學習筆記(二)迭代器 演算法

2022-07-13 11:27:13 字數 1296 閱讀 7226

上次是容器,這次是迭代器和演算法。迭代器可以說就是為演算法服務的,所以和演算法放在一起寫。

迭代器是演算法使用容器的媒介。演算法本身作為乙個函式,對於它所操作的容器是不了解的,因此傳入的迭代器必須能夠給出足夠的資訊,使演算法能夠運作。

迭代器對於結構不同的迭代器,有不同的型別。其中四種型別是有鏈式的繼承關係,分別是input,forward,bidirectional, random。input迭代器不能移動,forward迭代器只能向前移動乙個單位,bidirection可以向兩側移動乙個單位,random可以任意移動。output迭代器單獨一類,比較特殊。

根據容器的資料結構,很容易判斷它的迭代器型別。為了方便,還是整理一下。

random:array,vector,deque,string(也可以認為是容器)。

bidirectional:set,multiset,map,multimap。

forward:unordered家族。

input和output主要被istream和ostream使用,可以暫時忽略。

迭代器萃取機?大概是這麼翻譯。這是乙個模版類,接受乙個迭代器類作為模版引數。它的作用主要是回答有關迭代器和它背後容器的問題。如迭代器指向的資料型別是什麼?迭代器本身的型別是什麼(上面那幾種)?演算法呼叫時需要提出這些問題才能夠宣告合適型別的變數,做合適的操作,正常執行。

iterator_traits類本身並沒有成員變數或函式,只由一堆typedef構成,用來回答演算法關於型別的提問。該類對於指標和常指標的模版引數進行了偏特化,如array和string傳入的迭代器就是指標。

如果你不理解這東西有啥用的話,舉個例子。假如有乙個演算法函式,返回傳入的兩個迭代器之間的最大值,並且給出了比較的演算法。這時就有個問題了,寫這個函式的時候你怎麼知道返回值的型別是什麼呢?c++不是python,不寫返回型別編譯器是不幹的。這種時候你就可以:

template iterator_traits::value_type

maxvalue(...){}

通過向萃取機提問,就可以獲得需要的型別。還有在很多時候需要對迭代器的型別做限制。如對於random access迭代器可以做的操作不能對forward迭代器做。

很多時候,如果細心的話,你會發現有的演算法是重複的。比如sort,演算法庫里有乙個,list類中也實現了乙個。這種情況下優先用類自己的函式,它肯定是對指定類有優化的。如果類本身沒有實現,再去用標準庫的。

本來是想自己介紹幾個的,想了想沒必要。到這裡查就行了(c++ reference)。

看的時候要仔細看看要求,有的演算法是有先決條件的。比如binary_search要求容器是排序的,他不負責幫你排序。

《C 標準程式庫》 STL迭代器

所有容器有含有其各自的迭代器型別 iterator types 所以當你使用一般的容器迭代器時,並不需要含入專門的標頭檔案。不過有幾種特別的迭代器,例如逆向迭代器,被定義於中。迭代器共分為五種,分別為 input iterator output iterator forward iterator b...

C 學習筆記 STL標準模板庫(二)STL容器類

介面卡容器 關聯式容器 vector與deque的迭代器支援算術運算,list的迭代器只能進行 操作,不支援普通的算術運算。引用標頭檔案用於儲存連續的元素,陣列,定義一維陣列,如下,vector int pos 32,1 定義32個字元 vector char a 32 a.pop back a.p...

C 學習筆記 STL(標準模板庫)

1 首先 需要學習c 模板的概念 2 c stl 標準模板庫 是一套功能強大的 c 模板類,提供了通用的模板類和函式,這些模板類和函式可以實現多種流行和常用的演算法和資料結構,如向量 鍊錶 佇列 棧。3 c 標準模板庫的核心包括以下三個元件 元件描述 容器 containers 容器是用來管理某一類...