迭代器介绍

我们已经知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另外一种更通用的机制也可以实现同样的目的,这就是迭代器。所有标准库容器都可以使用迭代器,但是其中只有少数几种才同时支持下标运算符。严格来说,string对象不属于容器类型,但是string支持很多与容器类型类似的操作。vector支持下标运算符,这点和string一样;string支持迭代器,这也和vector是一样的。

类似于指针类型,迭代器也提供了对对象的间接访问。就迭代器而言,其对象是容器中的元素或者string对象中的字符。使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另一个元素。迭代器有有效和无效之分,这一点和指针差不多。有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一个位置;其他所有情况都属于无效。

使用迭代器

和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。比如,这些类型都拥有名为begin和end的成员,其中begin成员负责返回指向第一个元素(或第一个字符)的迭代器。如有下述语句:

//由编译器决定b和e的类型;

//b表示v的第一个元素,e表示v尾元素的下一个位置

auto b=v.begin(),e=v.end();  //b和e的类型相同

end成员则负责返回指向容器“尾元素的下一个位置”的迭代器,也就是说,该迭代器指示的是容器的一个本不存在的“尾后“元素。这样的迭代器没有什么实际含义,仅是个标记而已,表示我们已经处理完了容器中的所有元素。end成员返回的迭代器常被作为尾后迭代器或简称为尾迭代器。特殊情况下如果容器为空,则begin和end返回的是同一迭代器。

如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。

迭代器运算符

下面列举了迭代器支持的一些运算。使用==和!=来比较两个合法的迭代器是否相等,如果两个迭代器指向的元素相同或者都是同一个容器的尾后迭代器,则它们相等;否则就说这两个迭代器不相等。

标准容器迭代器的运算符

*iter        返回迭代器iter所指元素的引用

iter->mem     解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem

++iter       令iter指示容器的下一个元素

--iter         令iter指示容器中的上一个元素

iter1==iter2    判断两个迭代器是否相等(不相等),如果两个迭代器指示的是同一元素或者它们是同一容器的尾后迭代器则相等;反正,不相等

iter1!=iter2       

和指针类似,也能通过解引用迭代器来获取它所指示的元素,执行解引用的迭代器必须合法并确实指示着某个元素。试图解引用一个非法迭代器或者尾后迭代器都是未定义的行为。

将元素从一个元素移动到另外一个元素

迭代器使用递增(++)运算符来从一个元素移动到下一个元素。从逻辑上来说,迭代器的递增和整数的递增类似,整数的递增是在整数值上”加1“,迭代器的递增则是将迭代器”向前移动一个位置“。

因为end返回的迭代器并不实际指示某个元素,所以不能对其进行递增或解引用的操作。

迭代器类型

就像不知道string和vector的size_type成员到底是什么类型一样,一般来说我们也不知道迭代器的精确类型。而实际上,那些拥有迭代器的标准库类型使用iterator和const_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

begin和end操作

begin和end返回的具体类型由对象是否是常量决定,如果对象时常量,begin和end返回const_iterator;如果对象不是常量,返回iterator:

vector<int> v;

const vector<int> cv;

auto it1=v.begin();  //it1的类型是vector<int>::iterator;

auto it2=cv.begin();  //it2的类型是vector<int>::const_iterator

有时候这种默认的行为并非我们想要的。为了便于专门得到const_iterator类型的返回值,C++11新标准引入了两个函数,分别是cbegin和cend:

auto it3=v.cbegin();  //it3的类型是vector<int>::const_iterator

类似于begin和end,上述两个新函数也分别返回指示容器第一个元素或最后元素下一个位置的迭代器。有所不同的是,不论vector对象本身是不是常量,返回值都是const_iterator。

迭代器介绍

时间: 2024-10-27 19:42:38

迭代器介绍的相关文章

C++ Iterator迭代器介绍及Iterator迭代器用法代码举例

C++ Iterator迭代器介绍 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针.举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历.有这么几种迭代器如下: 迭代器 描述 input_iterator 提供读功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*). output_iterator 提供写功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*). forward_iterator 可向前移动的,同时具有读写功能的迭代器.同

python 生成器和迭代器介绍

在正式接触生成器之前,我们先来了解一些概念 容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个迭代获取,可以用in.not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中(也有一些特殊的存在). Python中常见的容器对象: list ,deque, ... set, frozensets, ... dict, defaultdict, OrderedDict, Counter, ... tuple, nametuple,

3.4迭代器介绍

3.4.1 使用迭代器 1.begin和end,begin指向第一个元素,end指向尾元素的下一个位置.end返回的迭代器被称为尾后迭代器.(end和begin返回为位置(指看成指针)) 若容器为空,则begin和end返回的都是尾后迭代器. 2.迭代器与迭代器有减法,无加法.迭代器与整数有加减. 3.迭代器类型: 4. const vector<int> cv; auto it1 = v.begin();//it1的类型是vector<int>::iterator auto it

&lt;C++学习十三&gt;C++迭代器介绍(未完待续)

摘要: 本篇博客仅作为笔记,如有侵权,请联系,立即删除(网上找博客学习,然后手记笔记,因纸质笔记不便保存,所以保存到网络笔记) 迭代器简介: (1)迭代器类似于指针类型,它也提供了对对象的间接访问. (2)指针是C语言中就有的东西,迭代器是C++中才有的,指针用起来灵活高效,迭代器功能更丰富些. (3)迭代器提供一个对容器对象或者string对象的访问方法,并且定义了容器范围. begin end,前面的string和vector容器均有 原文地址:https://www.cnblogs.com

9.8-全栈Java笔记:Iterator(迭代器)接口

迭代器介绍 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象. Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作. Iterator接口定义了如下方法: boolean hasNext();  //判断是否有元素没有被遍历 Object next();      //返回游标当前位置的元素并将游标移动到下一个位置 void remove(); //删除游标左面的元素,在执行完next之后该操作只能执行一次 图1

【java设计模式】(6)---迭代器模式(案例解析)

设计模式之迭代器模式 一.java迭代器介绍 1.迭代器接口 在jdk中,与迭代器相关的接口有两个:Iterator 与 Iterable. Iterator:迭代器,Iterator及其子类通常是迭代器本身的结构与方法:迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的.只要拿到 这个对象,使用迭代器就可以遍历这个对象的内部. Iterable:可迭代的,那些想用到迭代器功能的其它类,如AbstractList HashM

为什么要使用泛型和迭代器

为什么要使用泛型和迭代器 + 面试题 泛型 1)为什么要用泛型? 在泛型没有诞生之前,我们经常会遇到这样的问题,如以下代码所示: ArrayList arrayList = new ArrayList(); arrayList.add("Java"); arrayList.add(24); for (int i = 0; i < arrayList.size(); i++) { String str = (String) arrayList.get(i); System.out.

Python案例详解Python文件迭代的方法

在python开发中,我们常常都会用到迭代器,所以对于python初学者来说,必须掌握迭代器相关知识.本文小编就将为大家分享有关迭代器的相关知识,觉得有必要了解或加深了解的童鞋,请往下看. 1.迭代器介绍 可迭代对象:列表.元组.字符串 迭代工具:for循环.列表解析.in成员关系测试.map内建函数 下面,通过具体的例子,给大家展示一下: 1. >>> for item in (1,3,4,5): 2.   print(item) 3. 4. 1 5. 3 6. 4 7. 5 8. &

chapter 3 字符串,向量和数组

类型是C++编程的基础,类型规定了对象的存储要求以及所能执行的操作,C++提供了一套基础内置类型,类型分为常量以及非常量,一个常量对象必须初始化,一旦初始化就不能再改变.此外可以重复定义复合变量.复合类型以其他的类型为基础. 编写自己的头文件: 类一般不定义在函数体内,在函数体外部使用类的时候,在各个指定的源文件中只有一处为类的定义,并且在不同文件中使用同一个类,类的定义必须保持一致. 类通常定义在头文件中,类所在头文件的名字应该和类的名字一样. 3.1 命名空间以及using声明 目前为止,用