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; }
相关文章
相关标签/搜索