《C 標準程式庫》學習筆記(三)迭代器

2021-05-24 01:47:08 字數 2997 閱讀 2628

迭代器是乙個「可遍歷

stl容器內全部或部分元素」的物件。乙個迭代器用來指出容器中的乙個特定位置。迭代器奉行乙個純粹抽象概念:任何東西,只要行為類似迭代器,就是一種迭代器。

迭代器的分類(

iterator categories

)根據能力的不同,迭代器被劃分為五種不同類別。

迭代器型別(

category)能力

**者input

迭代器向前讀取(

read

)istream

output

迭代器向前寫入(

write

)ostream

,inserter

forward

迭代器向前讀取和寫入

bidlrectional

迭代器向前和向後讀取和寫入

list

,set

,multiset

,map

,mulitimap

random access

迭代器隨即訪問,可讀取也可寫入

vector

,deque

,string

,array

stl預先定義好的所有容器,其迭代器均屬於以下兩種型別:

bidlrectional

迭代器、隨即訪問迭代器(

random access iterator

)。迭代器的基本操作

loperator*

loperator++

loperator==

operator!=

loperator=

所有容器類別都提供有一些成員函式,使我們得以獲得迭代器並以之遍訪所有元素。這些函式中最重要的是:

lbegin()

返回乙個迭代器,指向容器起始點,也就是第乙個元素(如果有的話)的位置。

lend()

返回乙個迭代器,指向容器結束點。結束點在最後乙個元素之後,這樣的迭代器又稱為「逾尾(

past-the-end

)」迭代器。

圖1 容器的begin()和end()成員函式

迭代器的型別

任何一種容器都定義有兩種迭代器型別: l

container::iterator

以「讀/

寫」模式遍歷元素。 l

container::const_iterator

以「唯讀」模式遍歷元素。

迭代器相關輔助函式

c++標準程式庫為迭代器提供了三個輔助函式:

advance()

,distance()

和iter_swap()。

輔助函式

說明advance()

前進(或後退)多個元素。

distance()

處理迭代器之間的距離。

iter_swap()

可交換兩個迭代器所指元素的內容。

迭代器之配接器(

iterator adapters)

c++標準程式庫提供了數個預先定義的特殊迭代器,亦即所謂迭代器介面卡(

iterator adapters

)。它們不僅起輔助作用,還能賦予整個迭代器抽象概念更強大的能力。 l

insert iterators

(安插型迭代器) l

stream iterators

(流迭代器) l

reverse iterators

(逆向迭代器)

1.insert iterators

預先定義的三種

insert iterators

算式(expression

)inserter

種類容器

back_inserter(container) 使用

push_back()

在容器尾端安插元素,元素排列次序和安插次序相同。

vector

,deque

,list

front_inserter(container) 使用

push_front()

在容器前端安插元素,元素排列次序和安插次序相反。

deque

,list

inserter(container, pos) 使用

insert()

在pos

位置上安插元素,元素排列次序和安插次序相同。

所有stl

容器。

2.stream iterators

stream

迭代器是一種迭代器配接器,通過它,你可以把

stream

當成演算法的原點和終點。 l

ostream

迭代器可以將被賦予的值寫入

output stream中。

listream

迭代器用來從

input stream

中讀取元素。

3.reverse iterators

reverse iterators

將increment

(遞增)運算轉換為

decrement

(遞減)運算,反之亦然。所有容器都可以透過成員函式

rbegin()

和rend()

產生出reverse iterators。

lrbegin()

傳回逆向遍歷的第一元素位置,也就是實際上最後乙個元素的位置。 l

rend()

傳回逆向遍歷時最後乙個元素的下乙個位置,也就是實際上第乙個元素的前乙個位置。

你也可以將一般迭代器轉換成乙個

reverse

迭代器。當然,原本那個迭代器必須具有雙向移動能力。注意:轉換前後迭代器的邏輯位置發生了變化。

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

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

C 標準程式庫(學習筆記)二

p48 c 在main 的末尾隱式定義了乙個return 0 p53standard exceptions exception p63pair的比較時,第乙個元素具有較高的優先順序,如果兩個pair的第乙個元素不相等,其比較結果就為整個pair的比較結果 make pair 使你無需寫出型別就可以生...

C 標準程式庫

1.如果要把乙個template中的某個識別符號號指定為一種型別,就算意圖顯而易見,關鍵字typename也不可或缺,因此一般的規則是,除了以typename修飾之外,template內的任何識別符號號都被視為乙個值而非乙個型別.2.類的成員函式可以是個template,但這樣的成員函式既不能是vi...