迭代器

Posted 砚台是黑的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器相关的知识,希望对你有一定的参考价值。

一、介绍

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

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

就迭代器而言,其对象是容器中的元素或者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表达的意思相同。

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

以上是关于迭代器的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段6——CSS选择器

行历史查看器 - Git

持久片段和查看器

损坏的顶点和片段着色器

python使用上下文对代码片段进行计时,非装饰器

设计模式迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )