C++迭代器的使用和操作总结
目錄
- 一.定義和初始化
- 二.常用操作
- 三.迭代器const_iterator
- 四.使迭代器失效的操作
?
正文
迭代器是一種檢查容器內(nèi)元素并遍歷元素的數(shù)據(jù)類型。C++更趨向于使用迭代器而不是下標(biāo)操作,因?yàn)闃?biāo)準(zhǔn)庫為每一種標(biāo)準(zhǔn)容器(如vector)定義了一種迭代器類型,而只用少數(shù)容器(如vector)支持下標(biāo)操作訪問容器元素。
回到頂部
一.定義和初始化
每種容器都定義了自己的迭代器類型,如vector:
vector<int>::iterator iter; //定義一個(gè)名為iter的變量每種容器都定義了一對(duì)名為begin和en的函數(shù),用于返回迭代器。下面對(duì)迭代器進(jìn)行初始化操作:
vector<int> ivec; vector<int>::iterator iter1=ivec.bengin(); //將迭代器iter1初始化為指向ivec容器的第一個(gè)元素vector<int>::iterator iter2=ivec.end(); //將迭代器iter2初始化為指向ivec容器的最后一個(gè)元素的下一個(gè)位置注意end并不指向容器的任何元素,而是指向容器的最后元素的下一位置,稱為超出末端迭代器。如果vector為空,則begin返回的迭代器和end返回的迭代器相同。一旦向上面這樣定義和初始化,就相當(dāng)于把該迭代器和容器進(jìn)行了某種關(guān)聯(lián),就像把一個(gè)指針初始化為指向某一空間地址一樣。
回到頂部
二.常用操作
下面列出了迭代器的常用運(yùn)算操作:
*iter //對(duì)iter進(jìn)行解引用,返回迭代器iter指向的元素的引用 iter->men //對(duì)iter進(jìn)行解引用,獲取指定元素中名為men的成員。等效于(*iter).men ++iter //給iter加1,使其指向容器的下一個(gè)元素 iter++ --iter //給iter減1,使其指向容器的前一個(gè)元素 iter-- iter1==iter2 //比較兩個(gè)迭代器是否相等,當(dāng)它們指向同一個(gè)容器的同一個(gè)元素或者都指向同同一個(gè)容器的超出末端的下一個(gè)位置時(shí),它們相等 iter1!=iter2假設(shè)已經(jīng)聲明一個(gè)vector<int>的ivec容器,下面用迭代器來遍歷ivec容器,把其每個(gè)元素重置為0:
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)*iter=0;在C++定義的容器類型中,只有vector和queue容器提供迭代器算數(shù)運(yùn)算和除!=和==之外的關(guān)系運(yùn)算:
iter+n //在迭代器上加(減)整數(shù)n,將產(chǎn)生指向容器中錢前面(后面)第n個(gè)元素的迭代器。新計(jì)算出來的迭代器必須指向容器中的元素或超出容器末端的下一個(gè)元素 iter-niter1+=iter2 //將iter1加上或減去iter2的運(yùn)算結(jié)果賦給iter1。兩個(gè)迭代器必須指向容器中的元素或超出容器末端的下一個(gè)元素 iter1-=iter2iter1-iter2 //兩個(gè)迭代器的減法,得出兩個(gè)迭代器的距離。兩個(gè)迭代器必須指向容器中的元素或超出容器末端的下一個(gè)元素>,>=,<,<= //元素靠后的迭代器大于靠前的迭代器。兩個(gè)迭代器必須指向容器中的元素或超出容器末端的下一個(gè)元素注意兩個(gè)迭代器相減得出兩個(gè)迭代器對(duì)象的距離,該距離名為difference_type的signed類型的值,該類型類似于size_type類型,也是有vector定義的。可以迭代器算術(shù)操作來移動(dòng)迭代器直接指向某個(gè)元素:
vector<int>::iterator mid=v.begin()+v.size()/2; //初始化mid迭代器,使其指向v中最靠近正中間的元素回到頂部
三.迭代器const_iterator
每種容器還定義了一種名為const_iterator的類型。該類型的迭代器只能讀取容器中的元素,不能用于改變其值。之前的例子中,普通的迭代器可以對(duì)容器中的元素進(jìn)行解引用并修改,而const_iterator類型的迭代器只能用于讀不能進(jìn)行重寫。例如可以進(jìn)行如下操作:
for(vector<int>::const_iterator iter=ivec.begin();iter!=ivec.end();++iter)cout<<*iter<<endl; //合法,讀取容器中元素值for(vector<int>::const_iterator iter=ivec.begin();iter!=ivec.end();++iter)*iter=0; //不合法,不能進(jìn)行寫操作const_iterator和const? iterator是不一樣的,后者對(duì)迭代器進(jìn)行聲明時(shí),必須對(duì)迭代器進(jìn)行初始化,并且一旦初始化后就不能修改其值。這有點(diǎn)像常量指針和指針常量的關(guān)系。例如:
vector<int> ivec(10); const vector<int>::iterator iter=ivec.begin(); *iter=0; //合法,可以改變其指向的元素的值 ++iter; //不合法,無法改變其指向的位置回到頂部
四.使迭代器失效的操作
由于一些對(duì)容器的操作如刪除元素或移動(dòng)元素等會(huì)修改容器的內(nèi)在狀態(tài),這會(huì)使得原本指向被移動(dòng)元素的迭代器失效,也可能同時(shí)使其他迭代器失效。使用無效的迭代器是沒有定義的,可能會(huì)導(dǎo)致和使用懸垂指針相同的問題。所以在使用迭代器編寫程序時(shí),需要特別留意哪些操作會(huì)使迭代器失效。使用無效迭代器會(huì)導(dǎo)致嚴(yán)重的運(yùn)行時(shí)錯(cuò)誤。
?
參考文獻(xiàn)
《C++ PRIMER》 中文版
總結(jié)
以上是生活随笔為你收集整理的C++迭代器的使用和操作总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QApplication和QCoreAp
- 下一篇: s3c2440移植MQTT