STL: std::iterator_traits.

Iterator(迭代器)是一種 "可以迭代某序列內全部元素"的對象,可經過改編自尋常pointer的一致接口來完成工做。dom

Iterator奉行一個純抽象的概念: 任何東西,只要行爲相似iterator,就是一種Iterator。可是不一樣的迭代器擁有不一樣的能力。函數

廢話很少了說咱們來了解一下迭代器的分類.spa

Output-iterator:對象

Output-iterator容許一步一步前行並搭配write動做.所以你能夠經過Output-iterator對區間內的元素進行挨個賦值,可是不能使用Output-iterator對同一區間迭代2次.索引

其支持的操做:接口

*iter = val : 將val寫到迭代器所指位置.input

++iter : 向前步進,返回新位置(也可能只是個無用的操做,參考std::ostream_iterator).it

iter++ : 向前步進,一般狀況下返回舊位置(也可能只是個無用的操做,參考std::ostream_iterator).io

標準庫提供了std::ostream_iterator是典型的 Output-iterator!stream

 

           咱們經常使用的全部迭代器都具備Input-iterator的能力,並且更強.

Input-iterator:

Input-iterator迭代器只能一次一個之前進方向讀取元素,按此順序一個個返回元素值。

其支持的操做:

*iter :  返回讀取到的值.

iter->member : 返回讀取的元素的成員.

++iter : 向前步進(返回新位置).

iter++ : 向前步進(發揮舊位置).

iter1 == iter2 : 判斷2個迭代器是否相等.

iter1 != iter2 : 判斷2個迭代器是否不相等.

TYPE(iter) : 拷貝構造函數.

其中標準庫對於Input-iterator的 ==和!= 沒有要求: 若是兩個input-iterator都不是尾後迭代器,且指向不一樣位置,他們的比較結果會不相等.

其中標準庫中的std::istream_iterator是典型的Input-iterator!

 

Forward-iterator:

Forward-iterator提供保證: 若是兩個Forward-iterator都不是尾後迭代器,且指向不一樣的位置,它們的比較結果必定不會相等!

其支持的操做:

*iter : 返回讀取到的值.

iter->member : 訪問讀取到的元素的成員(若是有的話).

++iter : 向前步進(返回新位置).

iter++ : 向前步進(返回舊位置).

iter1 == iter2 : 判斷2個迭代器是否相等.

iter1 != iter2 : 判斷2個迭代器時候不相等.

TYPE() : 經過默認構造函數建立一個迭代器.

TYPE(iter) : 迭代器的拷貝構造函數.

iter1 = iter2 : 迭代器的拷貝賦值運算符.

兩個Forward-iterator若是指向同一個元素,調用 == 會獲得true, 若是二者同時遞增會再次指向同一個元素.

其中標準庫中的std::forward_list是典型的提供了Forward-iterator的表明.

 

Bidirectional-iterator:

Bidirectional-iterator是在Forward_iterator的基礎上增長了回頭的能力.換句話來講,它支持遞減操做,能夠一步一步後退.

其支持的操做:

*iter : 返回讀取到的值.

iter->member : 訪問讀取到的元素的成員(若是有的話).

++iter : 向前步進(返回新位置).

iter++ : 向前步進(返回舊位置).

iter1 == iter2 : 判斷2個迭代器是否相等.

iter1 != iter2 : 判斷2個迭代器時候不相等.

TYPE() : 經過默認構造函數建立一個迭代器.

TYPE(iter) : 迭代器的拷貝構造函數.

iter1 = iter2 : 迭代器的拷貝賦值運算符.

--iter : 步退返回新位置.

iter-- : 步退返回舊位置.

 

Random-access-iterator:

Random-access-iterator迭代器在Bidirectional-iterator的基礎上增長了隨機訪問的能力。所以它必須提供iterator算術運算。

其支持的操做:

*iter : 返回讀取到的值.

iter->member : 訪問讀取到的元素的成員(若是有的話).

++iter : 向前步進(返回新位置).

iter++ : 向前步進(返回舊位置).

iter1 == iter2 : 判斷2個迭代器是否相等.

iter1 != iter2 : 判斷2個迭代器時候不相等.

TYPE() : 經過默認構造函數建立一個迭代器.

TYPE(iter) : 迭代器的拷貝構造函數.

iter1 = iter2 : 迭代器的拷貝賦值運算符.

--iter : 步退返回新位置.

iter-- : 步退返回舊位置.

iter[n] : 訪問索引位置爲n的元素(針對尋常的 C-Style array).

iter+n : 將迭代器向前前進n個位置.

n+iter : 將迭代器向前前進n個位置.

iter - n: 將迭代器後退n個位置.

iter1 - iter2 : 返回2個迭代器之間的位置.

iter1 < iter2 : 判斷iter1是否在iter2以前.

iter1 > iter2 :判斷iter1是否在iter2以後.

iter1 <= iter2 :判斷iter1是否不在iter2以後.

iter1 >= iter2 : 判斷iter1是否不在iter2以前.

相關文章
相關標籤/搜索