zoukankan      html  css  js  c++  java
  • 读书笔记:C++ Primer系列(7)—— 标准库类型之iterator

    题记:

      继上篇所讲的vector,除了使用下标来访问vector对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(iterator)。所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。迭代器是一种检查容器内元素并遍历元素的数据类型

    7.1 容器的iterator类型

    每种容器类型都定义了自己的迭代器类型,如vector有:

                  vector<int>::iterator iter;  //这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型

    7.2 iterator的相关操作

    • begin和end操作

    每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。

    1. 如果容器不为空,begin操作返回的迭代器指向容器的第一个元素;end操作返回的迭代器指向容器的“末端元素的下一个”,表明它指向了一个不存在的元素。
    2. 如果容器为空,则begin和end返回的迭代器相同。
    • 自增和解引用操作

    迭代器类型可使用解引用操作符(*)来访问迭代器所指向的元素。

    解引用操作符返回迭代器当前所指向的元素。假设iter指向vector对象ivec的第一个元素,则*iter和ivec[0]就是指向同一个元素。

                                *iter = 0;//这条语句的作用就是将ivec[0]这个元素赋值为0

    迭代器使用自增操作符(++)向前移动迭代器指向容器中下一个元素,即:如果iter指向容器的第一个元素,则++iter指向第二个元素

    注意:由于end操作返回的迭代器不指向任何元素,因此不能对其进行解引用和自增操作

    • 迭代器比较操作——比较操作符(==或!=)

    如果两个迭代器对象指向同一个元素,则它们相等,否则就不相等。

    程序清单—01

        cout<<"方法1:使用下标将容器元素清0"<<endl;
        for(vector<int>::size_type ix=0;ix !=ivec.size();++ix)
        {
            ivec[ix]=0;
        }
        cout<<"方法2:使用迭代器将容器元素清0"<<endl;
        for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end();++iter)
        {
            *iter=0;
        }

    附:每个容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器中的元素,而不能改变其值。
    程序清单—02

    1     for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end();++iter)
    2     {
    3         *iter=0;
    4     }

    上述程序第3行编译出错:          error C3892: “iter”: 不能给常量赋值

        for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end();++iter)
        {
            cout<<*iter<<endl;
        }

    上述程序正确,只是从容器中读取元素

  • 相关阅读:
    ngRx 官方示例分析
    ngRx 官方示例分析
    oracle归档日志的操作
    【cocos2dx中Node类getParent和getChildByTag()】学习体会
    Objective-c调用Swift
    关于UITableView的黑线条
    Bootstrap风格button
    第7章 高级分组
    GDB 程序调试简单实践
    HDU 4548 美素数 素数题解
  • 原文地址:https://www.cnblogs.com/kkdd-2013/p/3490527.html
Copyright © 2011-2022 走看看