迭代器

轉自:https://www.cnblogs.com/maluning/p/8570717.htmlhtml

        https://www.cnblogs.com/ShaneZhang/p/4249173.html函數

 

正文spa

  迭代器是一種檢查容器內元素並遍歷元素的數據類型。C++更趨向於使用迭代器而不是下標操做,由於標準庫爲每一種標準容器(如vector)定義了一種迭代器類型,而只用少數容器(如vector)支持下標操做訪問容器元素。指針

一.定義和初始化

  每種容器都定義了本身的迭代器類型,如vector:code

vector<int>::iterator    iter;    //定義一個名爲iter的變量

  每種容器都定義了一對名爲begin和en的函數,用於返回迭代器。下面對迭代器進行初始化操做:htm

vector<int>    ivec;
vector<int>::iterator    iter1=ivec.bengin();    //將迭代器iter1初始化爲指向ivec容器的第一個元素

vector<int>::iterator   iter2=ivec.end();    //將迭代器iter2初始化爲指向ivec容器的最後一個元素的下一個位置

  注意end並不指向容器的任何元素,而是指向容器的最後元素的下一位置,稱爲超出末端迭代器。若是vector爲空,則begin返回的迭代器和end返回的迭代器相同。一旦向上面這樣定義和初始化,就至關於把該迭代器和容器進行了某種關聯,就像把一個指針初始化爲指向某一空間地址同樣。對象

二.經常使用操做

  下面列出了迭代器的經常使用運算操做:blog

複製代碼
*iter                //對iter進行解引用,返回迭代器iter指向的元素的引用
iter->men            //對iter進行解引用,獲取指定元素中名爲men的成員。等效於(*iter).men
++iter                //給iter加1,使其指向容器的下一個元素
iter++
--iter                //給iter減1,使其指向容器的前一個元素
iter--
iter1==iter2        //比較兩個迭代器是否相等,當它們指向同一個容器的同一個元素或者都指向同同一個容器的超出末端的下一個位置時,它們相等 
iter1!=iter2        
複製代碼

  假設已經聲明一個vector<int>的ivec容器,下面用迭代器來遍歷ivec容器,把其每一個元素重置爲0:it

for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
        *iter=0;

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

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

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

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

>,>=,<,<=        //元素靠後的迭代器大於靠前的迭代器。兩個迭代器必須指向容器中的元素或超出容器末端的下一個元素
複製代碼

  注意兩個迭代器相減得出兩個迭代器對象的距離,該距離名爲difference_type的signed類型的值,該類型相似於size_type類型,也是有vector定義的。能夠迭代器算術操做來移動迭代器直接指向某個元素:

vector<int>::iterator    mid=v.begin()+v.size()/2;    //初始化mid迭代器,使其指向v中最靠近正中間的元素

三.迭代器const_iterator

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

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;        //不合法,不能進行寫操做

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

vector<int>    ivec(10);
const    vector<int>::iterator    iter=ivec.begin();
*iter=0;    //合法,能夠改變其指向的元素的值
++iter;    //不合法,沒法改變其指向的位置

四.使迭代器失效的操做

  因爲一些對容器的操做如刪除元素或移動元素等會修改容器的內在狀態,這會使得本來指向被移動元素的迭代器失效,也可能同時使其餘迭代器失效。使用無效的迭代器是沒有定義的,可能會致使和使用懸垂指針相同的問題。因此在使用迭代器編寫程序時,須要特別留意哪些操做會使迭代器失效。使用無效迭代器會致使嚴重的運行時錯誤。

 

五.五種迭代器的使用

迭代器操做                      說明
(1)全部迭代器
p++                              後置自增迭代器
++p                              前置自增迭代器
(2)輸入迭代器
*p                                 復引用迭代器,做爲右值
p=p1                             將一個迭代器賦給另外一個迭代器
p==p1                           比較迭代器的相等性
p!=p1                            比較迭代器的不等性
(3)輸出迭代器
*p                                 復引用迭代器,做爲左值
p=p1                             將一個迭代器賦給另外一個迭代器
(4)正向迭代器
提供輸入輸出迭代器的全部功能
(5)雙向迭代器
--p                                前置自減迭代器
p--                                後置自減迭代器
(6)隨機迭代器
p+=i                              將迭代器遞增i位
p-=i                               將迭代器遞減i位
p+i                                在p位加i位後的迭代器
p-i                                 在p位減i位後的迭代器
p[i]                                返回p位元素偏離i位的元素引用
p<p1                             若是迭代器p的位置在p1前,返回true,不然返回false
p<=p1                           p的位置在p1的前面或同一位置時返回true,不然返回false
p>p1                             若是迭代器p的位置在p1後,返回true,不然返回false
p>=p1                           p的位置在p1的後面或同一位置時返回true,不然返回false

只有順序容器和關聯容器支持迭代器遍歷,各容器支持的迭代器的類別以下:容器                 支持的迭代器類別            容器               支持的迭代器類別            容器                 支持的迭代器類別vector              隨機訪問                      deque              隨機訪問                       list                   雙向set                   雙向                            multiset            雙向                           map                 雙向multimap          雙向                             stack                不支持                        queue              不支持priority_queue   不支持

相關文章
相關標籤/搜索