C 中的迭代器

2021-08-28 20:34:45 字數 3034 閱讀 8225

基本操作

迭代器的const_iterator

其他《簡單》示例**

參考迭代器可以算是c++程式設計中比較高階的的內容了,如果你對此還一無所知,可能你需要先了解一下模板,容器的概念。說到迭代器,首先這個名字就給人一種很厲害的感覺,他是個什麼東東呢?迭代器扮演容器與演算法之間的膠合劑,是所謂的「泛型指標」。而指標是c語言中就有的東西,迭代器是c++中才有的,指標用起來靈活高效,迭代器功能更豐富些。本文由**引例逐步進入迭代器的學習。

一段關於迭代器的定義和使用的簡單程式。

#include #include using namespace std;

int main()

每種容器都定義了一對名為begin和end的函式,其中begin成員返回指向第乙個元素(第乙個字元)的迭代器,而end成員返回指向容器尾元素的下乙個位置的迭代器,也就是說end指示的是乙個不存在的元素,所以叫end返回的是尾後迭代器。一般我們清楚乙個迭代器的準確型別是什麼,所以我們都是使用auto或者decltype來定義變數的。如果vector為空,則begin返回的迭代器和end返回的迭代器相同。一旦向上面這樣定義和初始化,就相當於把該迭代器和容器進行了某種關聯,就像把乙個指標初始化為指向某一空間位址一樣。

種類支援操作

輸入迭代器

是唯讀迭代器,在每個被遍歷的位置上只能讀取一次。

輸出迭代器

是只寫迭代器,在每個被遍歷的位置上只能被寫一次。

前向迭代器

兼具輸入和輸出迭代器的能力,但是它可以對同乙個位置重複進行讀和寫。但它不支援operator–,所以只能向前移動。

雙向迭代器

很像前向迭代器,只是它向後移動和向前移動同樣容易。

隨機訪問迭代器

有雙向迭代器的所有功能。而且,它還提供了「迭代器算術」,即在一步內可以向前或向後跳躍任意位置, 包含指標的所有操作,可進行隨機訪問,隨意移動指定的步數。支援前面四種iterator的所有操作,並另外支援it + n、it - n、it += n、 it -= n、it1 - it2和it[n]等操作。

下面是乙個關於

,find函式引數就是輸入迭代器。

#include #include #include #include using namespace std;

int main()

; vectorivec(arr, arr + 5);//定義容器vector

listilist(arr, arr + 5);//定義容器list

//在容器ivec的頭部和尾部之間尋找整形數3

vector::iterator iter1 = find(ivec.begin(), ivec.end(), 3);

if (iter1 == ivec.end())

cout<

if (iter2 == ilist.end())

cout<

templateinputiterator find(inputiterator first, inputiterator last, const t &value)

迭代器的一些常用操作

*iter                //對iter進行解引用,返回迭代器iter指向的元素的引用

iter->men //對iter進行解引用,獲取指定元素中名為men的成員。等效於(*iter).men

++iter //給iter加1,使其指向容器的下乙個元素

iter++

--iter //給iter減1,使其指向容器的前乙個元素

iter--

iter1==iter2 //比較兩個迭代器是否相等,當它們指向同乙個容器的同乙個元素或者都指向同同乙個容器的超出末端的下乙個位置時,它們相等

iter1!=iter2

運算操作

iter+n     //在迭代器上加(減)整數n,將產生指向容器中錢前面(後面)第n個元素的迭代器。新計算出來的迭代器必須指向容器中的元素或超出容器末端的下乙個元素

iter-n

iter1+=iter2 //將iter1加上或減去iter2的運算結果賦給iter1。兩個迭代器必須指向容器中的元素或超出容器末端的下乙個元素

iter1-=iter2

iter1-iter2 //兩個迭代器的減法,得出兩個迭代器的距離。兩個迭代器必須指向容器中的元素或超出容器末端的下乙個元素

>,>=,

每種容器還定義了一種名為const_iterator的型別。該型別的迭代器只能讀取容器中的元素,不能用於改變其值。之前的例子中,普通的迭代器可以對容器中的元素進行解引用並修改,而const_iterator型別的迭代器只能用於讀不能進行重寫。例如可以進行如下操作:

for(vector::const_iterator iter=ivec.begin();iter!=ivec.end();++iter)

cout<

*iter=0; //不合法,不能進行寫操作

const_iterator和const iterator是不一樣的,後者對迭代器進行宣告時,必須對迭代器進行初始化,並且一旦初始化後就不能修改其值。這有點像常量指標和指標常量的關係。例如:

vectorivec(10);

const vector::iterator iter=ivec.begin();

*iter=0; //合法,可以改變其指向的元素的值

++iter; //不合法,無法改變其指向的位置

除各種已無法詳細溯源的程式設計著作外還參考了這些網際網路資源,感謝他們的分享。

C 中的迭代器

迭代器iterator,它是指標的泛化形式,每種迭代器只能用於它自己的容器類。1 前遞增和後遞增操作符 將迭代器跳到下乙個資料項 2 前遞減和後遞減操作符 將迭代器跳到上乙個資料項 3 相等操作符 和不相等操作符!測試兩個迭代器是否指向同乙個位置 4 提領操作符 加入p是迭代器變數,使用 p就能訪問...

C 中的迭代器模式

聚合介面 public inte ce ilistcollection 迭代器介面 public inte ce iterator 具體聚合類 public class persons ilistcollection public void add intvalue public iterator ...

C 中的迭代器基礎

yield 關鍵字用於指定返回的乙個或多個值。到達 yield return 語句時,會儲存當前位置。下次呼叫迭代器時將從此位置重新開始執行。迭代器對集合類特別有用,它提供一種簡單的方法來迭代複雜的資料結構 如二進位制樹 摘自msdn 其實照我的理解來說,迭代器就是可以用foreach訪問的資料,也...