C 之 迭代器

2021-08-18 12:36:11 字數 2655 閱讀 1243

迭代器是一種檢查容器內元素並遍歷元素的資料型別。c++一般趨向於使用迭代器而不是下標操作。

每種容器都定義了自己的迭代器型別,例如vector:

vector

::iterator iter; //定義乙個名為iter的迭代器

迭代器的初始化

vector

ivec;

vector

::iterator iter1=ivec.bengin(); //將迭代器iter1初始化為指向ivec容器的第乙個元素

vector

::iterator iter2=ivec.end(); //將迭代器iter2初始化為指向ivec容器的最後乙個元素的下乙個位置

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

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

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

iter++

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

iter--

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

iter1!=iter2

用迭代器遍歷容器ivec,並把其每個元素重置為0

vector

::iterator iter=ivec.begin()

for(;iter!=ivec.end();++iter)

*iter=0;

在c++定義的容器型別中,只有vector和queue容器提供迭代器算數運算和除!=和==之外的關係運算:

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

iter-n

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

iter1-=iter2

iter1-iter2

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

>,>=,<,<=

//元素靠後的迭代器大於靠前的迭代器。兩個迭代器必須指向容器中的元素或超出容器末端的下乙個元素

const_iterator型別的迭代器只能讀取容器中的元素,不能用於改變其值。之前的例子中,普通的迭代器可以對容器中的元素進行解引用並修改。

for(vector

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

cout

<<*iterfor(vector

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

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

const iterator:對const iterator迭代器進行宣告時,必須對迭代器進行初始化,並且一旦初始化後就不能修改其值。

vector

ivec(10);

const

vector

::iterator iter=ivec.begin();

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

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

分三種情況考慮:

1).陣列型資料結構:該資料結構的元素是分配在連續的記憶體中,insert和erase操作,都會使得刪除點和插入點之後的元素挪位置,所以,插入點和刪除點之後的迭代器全部失效,也就是說insert(*iter)(或erase(*iter)),然後再iter++,是沒有意義的

解決方法:erase(*iter)的返回值是下乙個有效迭代器的值。iter =cont.erase(iter)

2).鏈表型資料結構:對於list型的資料結構,使用了不連續分配的記憶體,刪除運算使指向刪除位置的迭代器失效,但是不會失效其他迭代器。

解決辦法有兩種,erase(*iter)會返回下乙個有效迭代器的值,或者erase(iter++).

3).樹形資料結構:使用紅黑樹來儲存資料,插入不會使得任何迭代器失效

刪除運算使指向刪除位置的迭代器失效,但是不會失效其他迭代器。erase迭代器只是被刪元素的迭代器失效,但是返回值為void,所以要採用erase(iter++)的方式刪除迭代器。

注意:經過erase(iter)之後的迭代器完全失效,該迭代器iter不能參與任何運算,包括iter++,*ite

C 迭代器之 反向迭代器

反向迭代器 reverse iterator 是普通迭代器的介面卡,通過重新定義自增和自減操作,以達到按反序遍歷元素的目的。如果在標準演算法庫中用反向迭代器來代替普通的迭代器,那麼執行結果與正常情況下相反。除此之外,其用法與普通迭代器完全一樣,我們不作詳細討論。這裡主要討論的是反向迭代器的乙個很特殊...

C 之迭代器

迭代器是一種物件,用於對stl容器的元素進行處理。它指向容器內部特定位置,並提供以下基本運算。讓迭代器指向下乙個元素 判斷兩個迭代器是否指向同乙個位置 將右側的值代入左側迭代器所引用的位置 返回該位置的值 迭代器對任何種類的容器都可以用同一種方法 語法 順次訪問其元素。此外,在處理陣列元素時它還可以...

c 之反向迭代器

include include include using namespace std int main cout include include include using namespace std int main vectorv a,a 10 vector reverse iterator ...