Cpp中迭代器的使用和操作


1.迭代器(iterator)是什么?

  有道翻譯:iterator—— n. 迭代器、迭代程序

  百度百科:迭代器(iterator)是一種對象,它能夠用來遍歷標准模板庫容器中的部分或全部元素,每個迭代器對象代表容器中的確定的地址。迭代器修改了常規指針的接口,所謂迭代器是一種概念上的抽象:那些行為上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有機的統一起來。迭代器提供一些基本操作符:*、++、==、!=、=。這些操作和C/C++“操作array元素”時的指針接口一致。不同之處在於,迭代器是個所謂的復雜的指針,具有遍歷復雜數據結構的能力。

  博客園博主!Vincent迭代器是一種檢查容器內元素並遍歷元素的數據類型。C++更趨向於使用迭代器而不是下標操作,因為標准庫為每一種標准容器(如vector)定義了一種迭代器類型,而只用少數容器(如vector)支持下標操作訪問容器元素。

2.如何定義並初始化一個迭代器(iterator)?

  每種容器都定義了自己的迭代器類型,但它們的定義格式都相同。

  1) 正向迭代器定義方法:容器類名::iterator  迭代器名;

  2) 常量正向迭代器定義方法:容器類名::const_iterator  迭代器名;

  3) 反向迭代器,定義方法如下:容器類名::reverse_iterator  迭代器名;

  4) 常量反向迭代器,定義方法如下:容器類名::const_reverse_iterator  迭代器名;

  下面就用vector容器來進行舉例。

  vector<int> vec;  //定義一個名為vec的vector<int>類型的容器

  vector<int>::iterator iter=vec.begin();  //定義了一個名為iter的vec容器迭代器,並將迭代器iter初始化為指向vec容器的第一個元素

  vector<int>::iterator iter2=vec.end();  //定義了一個名為iter2的vec容器迭代器,將迭代器iter2初始化為指向vec容器的最后一個元素的下一個位置

  博客園博主!Vincent注意end並不指向容器的任何元素,而是指向容器的最后元素的下一位置,稱為超出末端迭代器。如果vector為空,則begin返回的迭代器和end返回的迭代器相同。一旦向上面這樣定義和初始化,就相當於把該迭代器和容器進行了某種關聯,就像把一個指針初始化為指向某一空間地址一樣。

3.迭代器(iterator)有哪些常用操作?

  通過迭代器可以讀取它指向的元素,*迭代器名就表示迭代器指向的元素,通過非常量迭代器還能修改其指向的元素。

  迭代器都可以進行++操作。反向迭代器和正向迭代器的區別在於:

    對正向迭代器進行++操作時,迭代器會指向容器中的后一個元素;

    而對反向迭代器進行++操作時,迭代器會指向容器中的前一個元素。

  常用的迭代器按功能強弱分為輸入、輸出、正向、雙向、隨機訪問五種,這里只介紹常用的三種。
    1)正向迭代器。假設 p 是一個正向迭代器,則 p 支持以下操作:++p,p++,*p。此外,兩個正向迭代器可以互相賦值,還可以用==!=運算符進行比較。

    2)雙向迭代器。雙向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一個雙向迭代器,則--p和p--都是有定義的。--p使得 p 朝和++p相反的方向移動。

    3)隨機訪問迭代器。隨機訪問迭代器具有雙向迭代器的全部功能。若 p 是一個隨機訪問迭代器,i 是一個整型變量或常量,則 p 還支持以下操作:

  • p+=i:使得 p 往后移動 i 個元素。
  • p-=i:使得 p 往前移動 i 個元素。
  • p+i:返回 p 后面第 i 個元素的迭代器。
  • p-i:返回 p 前面第 i 個元素的迭代器。
  • p[i]:返回 p 后面第 i 個元素的引用。

  此外,兩個隨機訪問迭代器 p1、p2 還可以用 <、>、<=、>= 運算符進行比較。p1<p2的含義是:p1 經過若干次(至少一次)++操作后,就會等於 p2。其他比較方式的含義與此類似。對於兩個隨機訪問迭代器 p1、p2,表達式 p2-p1 也是有定義的,其返回值是 p2 所指向元素和 p1 所指向元素的序號之差(也可以說是 p2 和 p1 之間的元素個數減一)。

  下圖(表一)列出了各個容器的迭代器功能:

  順便一提:在 C++ 中,數組也是容器。數組的迭代器就是指針,而且是隨機訪問迭代器。例如,對於數組 int a[10],int * 類型的指針就是其迭代器。則 a、a+1、a+2 都是 a 的迭代器。STL 中有用於操作迭代器的三個函數模板,它們是:

  • advance(p, n):使迭代器 p 向前或向后移動 n 個元素。
  • distance(p, q):計算兩個迭代器之間的距離,即迭代器 p 經過多少次 + + 操作后和迭代器 q 相等。如果調用時 p 已經指向 q 的后面,則這個函數會陷入死循環。
  • iter_swap(p, q):用於交換兩個迭代器 p、q 指向的值。                      

  要使用上述模板,需要包含頭文件 algorithm。

 

 

 

 

  

迭代器的輔助函數

STL 中有用於操作迭代器的三個函數模板,它們是:

  • advance(p, n):使迭代器 p 向前或向后移動 n 個元素。
  • distance(p, q):計算兩個迭代器之間的距離,即迭代器 p 經過多少次 + + 操作后和迭代器 q 相等。如果調用時 p 已經指向 q 的后面,則這個函數會陷入死循環。
  • iter_swap(p, q):用於交換兩個迭代器 p、q 指向的值。


要使用上述模板,需要包含頭文件 algorithm。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM