1. 程式人生 > >vactor的內部類 iterator(迭代器)

vactor的內部類 iterator(迭代器)

一、定義和初始化

    迭代器(iterator)是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的地址。

1、定義一個iterator物件

vector<int>::iterator iter;

  其中,vector<int>::iterator是型別名,表示的是vector<int>內定義的內部類iterator.

2、每種容器都定義了一對名為begin和end的函式,用於返回迭代器,vector的begin函式用於取得迭代器的初始位置,end用於取得最後元素的下一位置,稱為超出末端迭代器。下面對迭代器進行初始化

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

下面展示如何用迭代器對一個vector進行遍歷

vector<int> arr(10);
vector<int>::iterator iter;
for(iter = arr.begin(); iter != arr.end(); iter++)
{
   int& value = *iter;  //因為它把*也過載了
   printf("%d",value);
}

二、常用操作

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

假設已經宣告一個vector<int>的ivec容器。下面用迭代器來遍歷ivec容器,把其中每個元素重置為0

vector<int> ivec(20);
vector<int>::iterator iter;
for(iter = ivec.begin(); iter != ivec.end(); ivec++)
{
     *iter = 0;     //全部置為0;
}

三、迭代器const_iterator

  該型別的迭代器只能讀取容器中的元素,不能用於改變其值,普通的迭代器可以對容器中的元素進行解引用並修改,而const_iterator型別的迭代器只能用於讀不能進行重寫,例如可以進行如下操作:

for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end(); iter++)
{
    cout<<*iter<<endl;  //合法,讀取容器中的元素
    *iter = 0; //不合法,不能進行寫操作
}

const_iterator和const iterator是不一樣的,後者對迭代器進行宣告時,必須對迭代器進行初始化,並且一旦初始化後就不能修改其值,這有點向常量指標和指標常量的關係。例如:

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