C++ 迭代器头文件、种类

本文详细介绍了C++中的迭代器,包括迭代器头文件、五种迭代器的种类及其操作:Output迭代器、Input迭代器、Forward迭代器、Bidirectional迭代器和Random-access迭代器。每个迭代器类型的特点和常用操作都有详细说明,例如Output迭代器的写入操作,Input迭代器的读取操作,以及Random-access迭代器的随机访问能力。

迭代器头文件

所有容器都定义有各自的迭代器类型,所以当你打算使用某种容器的迭代器时,不必包含什么特殊的头文件。

不过有些特别的迭代器,比如反向迭代器,以及若干辅助的迭代函数,被定义于文件<iterator>



迭代器种类

分为五种迭代器:

Output迭代器: 向前写入
Input迭代器: 向前读取一次
Forward迭代器: 向前读取
Bidirectional迭代器: 向前和向后读取
Random-access迭代器: 以随机访问方式读取



Output迭代器

Output迭代器允许一步一步前行并搭配write动作,因此你可以一个一个元素地赋值,不能使用output迭代器对同意区间迭代两次.

Output迭代器的操作如下:

*iter = val :将val写入迭代器所指位置

++iter:向前步进,返回新位置

iiter++ :向前步进,返回旧位置



Input迭代器

Input迭代器的操作如下:

*iter :读取实际元素

iter->member :读取实际元素的成员

++iter:向前步进,返回新位置

iiter++ :向前步进,返回旧位置

iter1 == iter2 :判断两个迭代器是否相等

iter1 != iter2 :判断两个迭代器是否不等

TYPE(iter) :复制迭代器

input迭代器只能读取元素一次,如果你复制input迭代器,并令原input迭代器和新产生的拷贝都向前读取,可能会遍历不同的值

你应该尽可能优先选用前置递增操作符++iter,因为性能更好,不需要返回旧值,也就不必花费一个临时对象来保存旧值



Forward迭代器

Forward迭代器的操作如下:

*iter :访问实际元素

iter->member :访问实际元素的成员

++iter:向前步进,返回新位置

iiter++ :向前步进,返回旧位置

iter1 == iter2 :判断两个迭代器是否相等

iter1 != iter2 :判断两个迭代器是否不等

TYPE() :创建迭代器(默认构造函数)

TYPE(iter) :复制迭代器(copy构造函数)

iter = iter2 :对迭代器赋值

与input迭代器不同的是,

两个forward迭代器如果指向同一个元素,operator==会获得true,如果两者都递增,会再次指向同一个元素



Bidirectional双向迭代器

Bidirectional在forward迭代器的基础上增加了回头迭代的能力:

–iter :步退,返回新位置

iter–:步退,返回旧位置



Random-Access随机访问迭代器

Random-Access迭代器的操作如下:

iter[n] :访问索引位置为n的元素

iter+=n :前进n个元素

iter-=n:回退n个元素

iiter+n:返回iter之后的第n个元素

iter-n:返回iter之前的第n个元素

iter1-iter2:返回iter1和iter2之间的距离

iter1<iter2:判断iter1是否在iter2之前

iter1>iter2:判断iter是否在iter2之后

iter1<=iter2:判断iter1是否不在iter2之后

iter1>=iter2:判断iter1是否不在iter之前

随机迭代器由以下对象和类型提供:

可随机访问的容器:array、vector、deque
String
寻常的C-style数组

Vector迭代器的递增和递减

一般而言你可以递增或递减临时性迭代器,但对于array、vector和string在某些编译平台上,就不行。考虑下面例子:

std::vector<int>coll;
if(coll.size()>1)
{
	std::sort(++coll.begin(),coll.end());
}

编译++coll.begin()可能会失败,实际情况取决于平台.
因为vector、array、string的迭代器通常被实现为寻常指针,C++并不允许你修改任何基础类型的临时值,但对于struct和class则允许.因此,如果迭代器被实现为寻常指针,编译失败,如果被实现为class,则编译成功
C+11提供了next(),你可以这样写:

std::vector<int>coll;
if(coll.size()>1)
{
	std::sort(std::next(coll.begin()),coll.end());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值