所有容器有含有其各自的迭代器型別(iterator types),所以當你使用一般的容器迭代器時,並不需要含入專門的標頭檔案。不過有幾種特別的迭代器,例如逆向迭代器,被定義於中。
迭代器共分為五種,分別為: input iterator、output iterator、forward iterator、bidirectional iterator、random access iterator。
只能一次乙個向前讀取元素,按此順序乙個個傳回元素值。表2.1列出了input迭代器的各種操作行為。input迭代器只能讀取元素一次,如果你複製input迭代器,並使原input迭代器與新產生的副本都向前讀取,可能會遍歷到不同的值。純粹input迭代器的乙個典型例子就是「從標準輸入裝置(通常為鍵盤)讀取資料」的迭代器。
表示式效果*iter
讀取實際元素
iter->member
讀取實際元素的成員(如果有的話)
++iter
向前步進(傳回新位置)
iter++
向前步進(傳回舊位置)
iter1 == iter2
判斷兩個迭代器是否相同
iter1 != iter2
判斷兩個迭代器是否不相等
type(iter)
複製迭代器(
copy
建構函式)
表2.1
output迭代器和input迭代器相反,其作用是將元素值乙個個寫入。表2.2列出output迭代器的有效操作。operator*只有在賦值語句的左手邊才有效。output迭代器無需比較(comparison)操作。你無法檢驗output迭代器是否有效,或「寫入動作」是否成功。你唯一可以做的就是寫入、寫入、再寫入。
表示式效果
*iter = value
將元素寫入到迭代器所指位置
++iter
向前步進(傳回新位置)
iter++
向前步進(傳回舊位置)
type(iter)
複製迭代器(copy 建構函式)
表2.2
forward迭代器是input迭代器與output迭代器的結合,具有input迭代器的全部功能和output迭代器的大部分功能。表2.3總結了forward迭代器的所有操作。forward迭代器能多次指向同一群集中的同一元素,並能多次處理同一元素。
表示式效果
*iter
訪問實際元素
iter->member
訪問實際元素的成員
++iter
向前步進(傳回新位置)
iter++
向前步進(傳回舊位置)
iter1 == iter2
判斷兩個迭代器是否相同
iter1 != iter2
判斷兩個迭代器是否不相等
type()
產生迭代器(default建構函式)
type(iter)
複製迭代器(copy建構函式)
iter1 == iter2 複製
表2.3
bidirectional(雙向)迭代器在forward迭代器的基礎上增加了回頭遍歷的能力。換言之,它支援遞減操作符,用以一步一步的後退操作。
random access迭代器在bidirectional迭代器的基礎上再增加隨機訪問能力。因此它必須提供「迭代器算數運算」(和一般指標「指標算術運算」相當)。也就是說,它能加減某個偏移量、能處理距離(differences)問題,並運用諸如《和》的相互關係操作符進行比較。以下物件和型別支援random access迭代器:
3.1 advance()
令迭代器前進
3.2 distance()
處理迭代器之間的距離
3.3 iter_swap()
交換兩個迭代器所指內容
逆向迭代器重新定義遞增運算和遞減運算,使其行為正好倒置。成員函式rbegin()和rend()各傳回乙個reverse迭代器,和begin()和end()類似,共同定義乙個半開區間。用正向迭代器可以直接構造乙個逆向迭代器,但是構造之後會出現「錯位」現象。原因在逆向迭代器要保證半開區間不會越界,可呼叫逆向迭代器的base()函式,保證轉換值的正確性(迭代器移了一位)。
insert迭代器,也稱為inserters,用來將「賦值新值」操作轉換為「安插新值」操作。通過這種迭代器,演算法可以執行安插(insert)行為而非覆蓋(overwrite)行為。所有insert迭代器都隸屬於output迭代器型別。所以它只提供賦值(assign)新值的能力。表4.2.1列出insert迭代器的所有操作函式。
表示式效果
*iter
無實際操作(傳回iter)
iter = value 安插
value
++iter
無實際操作(傳回
iter)
iter++
無實際操作(傳回
iter)
表4.2.1
c++標準程式庫提供三種insert迭代器:back inserters, front inserters, general inserters。它們的區別在於插入位置。事實上它們各自呼叫所屬容器中不同的成員函式。所以insert迭代器初始化時要清楚知道自己所屬的容器是哪一種。表4.2.2列出insert迭代器的種類。
名稱class
其所呼叫的函式
生成函式
back inserter
back_inserter_iterator
push_back(value)
back_inserter(cont)
front inserter
front_insert_iterator
push_front(value)
front_inserter(cont)
general inserter
insert_iterator
insert(pos, value)
inserter(cont, pos)
stream迭代器是一種迭代器配接器,通過它,你可以把stream當成演算法的原點和終點。更明確的說,乙個istream迭代器可以用來從input stream中讀元素,而乙個ostream迭代器可以用來對output stream寫入元素。
stream迭代器的一種特殊形式是所謂的stream緩衝區迭代器,用來對stream緩衝區進行直接讀取和寫入操作。
ostream迭代器
ostream迭代器 可以被賦予的值寫入output stream中。下表列出ostream迭代器的各項操作
算式效果
ostream_iterator(ostream)
為ostream產生乙個ostream迭代器
ostream_iterator(ostream, delim) 為
ostream
產生乙個
ostream
迭代器,各元素間以
delim
為分隔符(請注意,
delim
的型別是
const char*)
*iter
無實際操作(傳回
iter)
iter = value 將
value
寫到ostream
,像這樣:
ostream<。其後再輸出乙個
delim
(分隔符;如有定義的話)
++iter
無實際操作(傳回
iter)
iter++
無實際操作(傳回
iter)
istream迭代器
istream迭代器是ostream迭代器的拍檔,用來從input stream讀取元素。透過istream迭代器,演算法可以從stream中直接讀取資料。istream迭代器的各項操作。
算式效果
istream_iterator()
產生乙個end-of-stream迭代器
istream_iterator(istream) 為
istream
產生的乙個迭代器(可能立即去讀第乙個元素)
*iter
傳回先前讀取的值(如果建構函式並未立刻讀取第乙個元素值,則本式執行讀取任務)
iter->member
傳回先前讀取的元素的成員(如果有的話)
++iter
讀取下乙個元素,並傳回其位置
iter++
讀取下乙個元素,並傳回迭代器指向前乙個元素
iter1 == iter2 檢查
iter1
和iter2
是否相等
iter1 != iter2 檢查
iter1
和iter2
是否不相等
《C 標準程式庫》學習筆記(三)迭代器
迭代器是乙個 可遍歷 stl容器內全部或部分元素 的物件。乙個迭代器用來指出容器中的乙個特定位置。迭代器奉行乙個純粹抽象概念 任何東西,只要行為類似迭代器,就是一種迭代器。迭代器的分類 iterator categories 根據能力的不同,迭代器被劃分為五種不同類別。迭代器型別 category ...
C 標準程式庫
1.如果要把乙個template中的某個識別符號號指定為一種型別,就算意圖顯而易見,關鍵字typename也不可或缺,因此一般的規則是,除了以typename修飾之外,template內的任何識別符號號都被視為乙個值而非乙個型別.2.類的成員函式可以是個template,但這樣的成員函式既不能是vi...
C 之標準程式庫
標準程式庫 c 中的標準程式庫是類庫和函式的集合,其使用核心語言寫成。標準程式庫提供若干泛型容器 函式物件 泛型字串和流 包含互動和檔案i o 支援部分語言特性和常用的函式,如開平方根。c 標準程式庫也吸收了iso c90c標準程式庫。標準程式庫的特性宣告於std命名空間之中。從上面這個定義來看,c...