迭代器是乙個「可遍歷
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...