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;
        }

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

  • 相关阅读:
    BZOJ 4318: OSU!
    BZOJ 3450: Tyvj1952 Easy
    BZOJ 1426: 收集邮票
    BZOJ 1415: [Noi2005]聪聪和可可
    BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡
    BZOJ 3270: 博物馆
    BZOJ 3143: [Hnoi2013]游走
    BZOJ 3166: [Heoi2013]Alo
    BZOJ 3261: 最大异或和
    BZOJ 1022: [SHOI2008]小约翰的游戏John
  • 原文地址:https://www.cnblogs.com/kkdd-2013/p/3490527.html
Copyright © 2011-2022 走看看