迭代器

所有标准库容器都可以使用迭代器,但是其中只有少数几种才支持下标运算符。迭代器有效和无效之分,这一点和指针差不多。有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一个位置,其他情况都属于无效。和指针不一样,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。比如这些类型都有名为begin和end的成员,其中begin成员负责返回指向第一个元素的迭代器,end成员负责返回指向容器“尾元素的下一个位置”的迭代器,也就是说该迭代器指示的是容器的一个根本不存在的“尾后”元素。这样的迭代器没什么实际含义,仅是个标记而已,表示我们已经处理完了所有的元素。特殊情况下如果容器为空,则begin和and返回的是同一个迭代器(都是尾后迭代器)。

auto b=v.begin(),e=v.end();

一般来说,我们不清楚(不在意)迭代器的类型到底是什么,在上面的例子中,使用auto关键字定义变量b和e,这两个变量的类型也就是begin和end的返回值类型。

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

因为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返回const_iterator;如果不是常量,返回iterator。有时候这种默认的行为并非我们所要。如果对象只需要读操作而无须写操作的话最好使用常量类型(比如const_iterator)。为了便于得到const_iterator类型的返回值,C++11新标准引入两个新函数,分别是cbegin和cend,类似于begin和end,上述两个新函数分别返回容器的第一个元素或最后元素下一个位置的迭代器。有所不同的是,不论vector对象(或string对象)本身是否是常量,返回值都是const_iterator。
某些vector对象的操作会使迭代器失效,已知的一个限制是不能再范围for循环中向vector对象添加元素。另外一个限制是任何一种可能改变vector对象容量的操作,比如push_back,都会使该迭代器失效的。

但凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。

迭代器运算

这里写图片描述

只要两个迭代器指向的是同一个容器中的元素或者尾元素的下一个位置,就能将其相减,所得结果是两个迭代器的距离。所谓距离指的是右侧的迭代器向前移动多少位置就能追上左侧的迭代器,其类型是名为difference_type的带符号整型数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值