C++中的迭代器

迭代器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

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/79369699