迭代器Iterator,它是指標的泛化形式,每種迭代器只能用於它自己的容器類。 一般的迭代器都擁有以下的操作符:
(1)前遞增和後遞增操作符++,將迭代器跳到下一個資料項目;
(2)前遞減和後遞減操作符–,將迭代器跳到上一個資料項目;
(3)相等操作符==和不相等操作符。=,測試兩個迭代器是否指向同一個位置;
(4)提領操作符*,加入P是迭代器變數,使用*p就能訪問位於p處的資料,有些容器既可讀又可寫,有些只能讀。
許多容器類都提供了以下的成員函數來返回迭代器對象,只想資料結構中的特殊資料元素:
• c.begin():返回容器c的迭代器,它指向容器c的第一個資料項目;• c.end():返回某個東西來測試迭代器在什麼時候越過容器c的最後一個資料項目,即end()傳回值標誌的是容器最後一個元素之後的位置,相當於一個哨兵值。
使用方法:for(p=c.begin();p!=c.end();p++)
例如使用vector的迭代器例子為:
#include <iostream> #include <vector> //引用vector的標頭檔 using namespace std; int main() { //定義一個vector容器 vector<int> container; for(int i=1;i<=4;i++){ container.push_back(i); //存入資料 } cout<<"Here is what id in the container:\n"; //定義一個迭代器 vector<int>::iterator p; //遍曆vector for(p=container.begin();p!=container.end();p++){ cout<<*p<<" "; } cout<<endl; //使用*p將資料全部置為0 cout<<"Setting entries to 0:\n"; for(p=container.begin();p!=container.end();p++){ *p=0; } cout<<"Now container contains:\n"; for(p=container.begin();p!=container.end();p++){ cout<<*p<<" "; } cout<<endl; return 0; }
可以使用==或是!=來判斷兩個迭代器是否定位到同一個元素;
下面用一個例子來看一下vector的迭代器是如何使用操作運算子的:
vector<char> container1; container1.push_back('A'); container1.push_back('B'); container1.push_back('C'); container1.push_back('D'); for(int i=0;i<4;i++){ cout<<"container1["<<i<<"] ==" <<container1[i]<<endl; } cout<<endl; //定義一個迭代器指向向量第一個元素的位置 vector<char>::iterator p1=container1.begin(); //隨機訪問 cout<<"The third entry is "<<container1[2]<<endl; //括弧標記法 //以下兩個類似,他們都不會改變p中的迭代器的值 cout<<"The third entry is "<<p1[2]<<endl; cout<<"The third entry is "<<*(p1+2)<<endl; cout<<"which has value of container1[0]"<<" "<<*p1<<endl; cout<<"Two steps forward and one step back:"<<endl; p1++; cout<<*p1<<endl; p1++; cout<<*p1<<endl; p1--; cout<<*p1<<endl;
根據運算子我們可以將迭代器分為: 正向迭代器:++ 雙向迭代器:++、– 隨機訪問迭代器:++、–、隨機訪問
其中以上的又可以各自分為常量和可變兩種,常量迭代器使用const_iterator修飾,例如:"vector<int>::const_itertaor p;",它不允許更改迭代器指向的元素。
此外還有一種逆向迭代器reverse_iterator,可以逆序遍曆:
vector<int>::reverse_iterator rp; for(rp=container.rbegin();rp!=container.rend();rp--){ cout<<*rp<<endl; }
常量版本為const_reverse_iterator;
當我們編程如下代碼時(vector中有ABCD四個元素):
vector<char>::iterator p2; for(p2=container1.begin();p2!=container1.end();p2++){ cout<<*p2<<" "; } vector<char>::reverse_iterator rp; for(rp=container1.rbegin();rp!=container1.rend();rp++){ cout<<*rp<<" "; } cout<<endl;
輸出:
/* A B C D D C B A */
此外還有很多種其他的迭代器,比如輸入迭代器、輸出迭代器等。
有關迭代器的參考資料可見:
Iterator-C++ Reference
Iterator library-cppreference