C++ 迭代器學習

  參考書籍:ios

  《C++ 程序設計》數組

  ....................................................................................................................數據結構

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

 

  迭代器實現:spa

  迭代器的做用就是提供一個遍歷容器內部全部元素的接口,所以迭代器的內部必須保存一個與容器相關聯的指針,而後重載各類運算操做來方便遍歷,其中最重要的就是運 算符和->運算符,以及++,–等可能須要的運算符重載。實際上這和C++標準庫中的智能指針(smart pointer)很像,智能指針也是將一個指針封裝,而後經過引用計數或是其它方法完成自動釋放內存的功能,爲了達到和原有指針同樣的功能,也須要 對*,->等運算符進行重載,下面參照智能指針實現了一個簡單vector的迭代器,其中幾個typedef暫時不用管,咱們後面會提到。 vecIter主要做用就是包裹一個指針,不一樣容器內部數據結構不相同,所以迭代器操做符重載的實現也會不一樣。好比++操做符,對於線性分配內存的數組來 說,直接對指針執行++操做便可,可是若是容器是List就須要採用元素內部的方法,好比ptr->next()之類的方法訪問下一個元素。因 此,STL容器都實現了本身的專屬迭代器。設計

  

  const_iterator迭代器:指針

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

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是不同的,後者對迭代器進行聲明時,必須對迭代器進行初始化,而且一旦初始化後就不能修改其值。這有點像常量指針和指針常量的關係。例如:blog

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

實例:接口

#include <iostream> #include <vector>
    using namespace std; int main() { vector<int> v;  //v是存放int類型變量的可變長數組,開始時沒有元素
        for (int n = 0; n<5; ++n) v.push_back(n); //push_back成員函數在vector容器尾部添加一個元素
        vector<int>::iterator i;  //定義正向迭代器
        for (i = v.begin(); i != v.end(); ++i) {  //用迭代器遍歷容器
            cout << *i << " ";  //*i 就是迭代器i指向的元素
            *i *= 2;  //每一個元素變爲原來的2倍
 } cout << endl; //用反向迭代器遍歷容器
        for (vector<int>::reverse_iterator j = v.rbegin(); j != v.rend(); ++j) cout << *j << " "; return 0; }
相關文章
相關標籤/搜索