迭代器是c++標準庫中的重要元件,特別是在容器內部,沒有迭代器,容器也就無所謂存在了。
例如:vector容器簡而言之就是3個迭代器 start finish 以及end_of_storage vector的任何操作都離不開這3個迭代器。。
接下來,總結一下c++ 中的迭代器的操作。
c++的迭代器分為5類,依次為 : input_iterator, output_iterator, forwrd_iterator, bidirectional_iterator 以及 random_access_iterator
訪問的級別由低到高,
下面的相應的模板函式的引數是以 「可進行該操作的最小迭代器型別」為基礎的。
函式 advance:
template void advance (inputiterator& it, distance n);迭代器前進 n 個距離。如果是隨機迭代器,直接 +n ,否則使用 ++ 操作移動。
使用方法:
list::iterator it = mylist.begin();
advance (it, 5);
函式distance:
templatetypename iterator_traits::difference_type求的是迭代器first與last間 的元素的個數,如果是隨機迭代器,直接使用 operator- 就好了,否則就要連續呼叫operator++操作符。distance (inputiterator first, inputiterator last);
用法:vectorc++11
vector::iterator it = lower_bound(a.begin(), a.end(), 4);
distance(a.begin(), it);
begin 和 end:等價於容器中的begin與end。
比如下述遍歷vector的方式:
vectora = ;
for(auto it = a.begin(), it != a.end(); ++it)
cout << *it << 」 」 ;
cout << endl;
等價於:
for(auto it = begin(a), it != end(a); ++it)
cout << *it << 」 」 ;
cout << endl;
prev函式:返回迭代器的前n個位置的迭代器:
template bidirectionaliterator prev (bidirectionaliterator it,例如要返回上述vector的最後乙個元素:typename iterator_traits::difference_type n = 1);
cout << prev(a.end() ) << endl;
要返回上述vector的倒數第3個元素:
cout << prev(a.end() , 3) << endl;
next函式:返回迭代器的後n個位置的迭代器:
template forwarditerator next (forwarditerator it,例如要返回上述vector的第二個元素typename iterator_traits::difference_type n = 1);
cout << next(a.begin()) << endl;
第k個元素:
cout << next(a.begin(), k-1) << endl;
上述函式中,後四個函式是c++11新新增的函式。
C 迭代器之 反向迭代器
反向迭代器 reverse iterator 是普通迭代器的介面卡,通過重新定義自增和自減操作,以達到按反序遍歷元素的目的。如果在標準演算法庫中用反向迭代器來代替普通的迭代器,那麼執行結果與正常情況下相反。除此之外,其用法與普通迭代器完全一樣,我們不作詳細討論。這裡主要討論的是反向迭代器的乙個很特殊...
C 迭代器 迭代器失效問題
問題描述 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。這是劍指offer上的一道經典習題,我們首先可以想到的解決方案是 再建立乙個臨時陣列把偶數先存放起來,然後把臨時空間的...
C 迭代器的失效
迭代器 iterator 是乙個可以對其執行類似指標的操作 如 解除引用 operator 和遞增 operator 的物件,我們可以將它理解成為乙個指標。但它又不是我們所謂普通的指標,我們可以稱之為廣義指標,你可以通過sizeof vector iterator 來檢視,所佔記憶體並不是4個位元組...