C++ 標准模板庫(STL)——迭代器(iterators)的用法及理解


C++ STL中迭代器(iterators)用於遍歷對象集合的元素。由於容器大小隨着插入刪除等操作動態改變,無法像靜態數組那樣獲取數組長度然后遍歷容器里的所有元素;這時就需要迭代器,每次從容器內第一個元素遍歷,直到迭代器等於容器的尾迭代器。這些集合可能是容器,也可能是容器的子集。迭代器按照定義方式分成以下四種。

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

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

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

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

其中,按照功能又可分為三類:

  1) 正向迭代器。假設 p 是一個正向迭代器,則 p 支持以下操作:++p,p++,*p。此外,兩個正向迭代器可以互相賦值,還可以用==和!=運算符進行比較。

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

  3) 隨機訪問迭代器(vector以及deque支持隨機訪問迭代器)。隨機訪問迭代器具有雙向迭代器的全部功能。若 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 之間的元素個數減一)。

注意:棧(stack)、隊列(queue)不支持迭代器。
用法舉例:(1)set的遍歷:

#include<iostream>
#include<set>        
using namespace std;

int main()
{
    set<int> int_set;
    for (int i = 0; i < 5; i++)
    {
        int_set.insert(i);            
    }
    for (set<int>::iterator it = int_set.begin(); it != int_set.end(); it++)
    {                       
        cout << *it << endl;
    }return 0;
}

(2)map的遍歷:

#include<iostream>
#include<map>    
using namespace std;

int main()
{
    map<int, char> my_map;                                 
    my_map[0] = 'a';                                        
    my_map[1] = 'b';
    my_map.insert(map<int, char>::value_type(2, 'c'));       
    for (map<int, char>::iterator it = my_map.begin(); it != my_map.end(); it++) //map.begin()、map.end():返回map的首、尾迭代器
    {
        cout << "key: " << it->first << " value: " << it->second << endl;
    }return 0;
}

注意對map的遍歷過程中由於map是以<key, value>形式保存的元素,所以在迭代時並不止一個值,所以在C++ STL中將迭代器的iterator->first表示map元素的“key”,用iterator->second表示map元素的“value”。


免責聲明!

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



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