zoukankan      html  css  js  c++  java
  • 迭代器

    一、介绍

    标准库容器都可以使用迭代器。

    类似于指针类型,迭代器提供了对对象的间接访问。

    就迭代器而言,其对象是容器中的元素或者string对象中的字符。

    使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。

    迭代器分有效和无效之分,这一点和指针差不多,有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一个位置。其他所有情况都属于无效。

    二、使用迭代器

    // 由编译器决定b和e的类型
    // b表示v的第一个元素, e表示v尾元素的下一个位置
    auto b = v.begin(), e = v.end();	// b和e的类型相同
    

    end成员函数负责返回指向容器(或string对象)尾元素的下一个位置的迭代器。

    end成员返回的迭代器常被称作尾后迭代器,或者简称为尾迭代器

    特殊情况下,如果容器为空,则beginend返回的是同一个迭代器,都是尾后迭代器

    迭代器运算符

    操作 说明
    *iter 返回迭代器iter所指元素的引用
    iter->mem 解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem
    ++iter 令iter指向容器中的下一个元素
    --iter 令iter指向容器中的上一个元素
    iter1 == iter2 判断两个迭代器是否相等,如果两个迭代器指向的是同一个元素或者它们是同一个容器中容器中的尾后迭代器,则相等;反之,不相等。
    iter1 != iter2 与 == 情况相反

    关键概念——泛型编程

    C++程序员习惯性地使用 !=而非<进行判断。

    所有标准库容器类型的迭代器类型都定义了==!=,但是它们中的大多数都没有定义<运算符。

    迭代器类型

    一般来说,我们也不知道(其实是无须知道)迭代器的精确类型。

    实际上,哪些拥有迭代器的标准库类型使用iteratorconst_iterator来表示迭代器的类型:

    vector<int>::iterator it;		// it能读写vector<int>的元素
    string::iterator it2;			// it2能读写string对象中的字符
    
    vector<int>::const_iterator it3;// it3只能读元素,不能写元素
    string::const_iterator it4;		// it4只能读字符, 不能写字符
    

    const_iterator和常量指针差不多,能读取但不能修改它所指的元素值。

    相反,iterator的对象可读可写。

    如果 vector对象或string对象是一个常量,只能使用const_iterator

    如果vector对象或string对象不是常量,那么既能使用iterator也能使用const_iterator

    C++11新标准引入两个新函数:cbegincend

    返回值类型均是const_iterator

    箭头运算符->:把解引用和成员访问两个操作结合在一起,即it->mem(*it).mem表达的意思相同。

    注意:任何使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。

  • 相关阅读:
    简述at和crontab命令
    自建yum仓库,分别为网络源和本地源
    简述rpm与yum命令的常见选项
    用户目录权限管理.手动添加用户.截取用户信息
    总结描述用户和组管理类命令的使用方法,系统用户相关信息,取出主机IP地址
    Android独立交叉编译环境搭建
    Python编程总结之常用三方模块
    GDB常用命令简介
    linux内核中task_struct与thread_info及stack三者的关系
    在Linux-PC上建立kdump调试环境
  • 原文地址:https://www.cnblogs.com/huaibin/p/15313247.html
Copyright © 2011-2022 走看看