c++primer学习笔记-----3.4迭代器介绍

本文介绍了C++中的迭代器,它作为一种通用机制用于访问容器的元素,类似于指针但更为灵活。迭代器分为有效和无效状态,begin和end函数分别提供指向容器首元素和尾元素后续位置的迭代器。迭代器支持递增和递减运算,但在比较时推荐使用'=='和'!='。C++11引入的cbegin和cend返回const_iterator,适合只读操作。注意,改变vector容量的操作会导致迭代器失效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们已经知道可以使用下标运算符来访问string 对象的字符或vector 对象的元素,还有另外一种更通用的机制也可以实现同样的目的,这就是迭代器

在第二部分中将要介绍,除了vector 以外,标准库还定义了其他几种容器。所有标准库容器都可以使用迭代器,但是只有少数几种才同时支持下标运算符。(严格来讲,string 对象不属于容器,但是string 对象支持很多与容器类型类似地操作)

迭代器在使用中类似指针类型,也提供了对对象的间接访问

迭代器有有效和无效之分:有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一位置;其余情况均属无效


3.4.1 使用迭代器


【和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员函数

通常来说,我们并不在意迭代器准确的类型是什么,在实际使用中,利用auto 关键字基本足够

如,这些类型都拥有名为begin 和end 的成员,其中begin 返回指向第一个元素的迭代器,end 返回指向容器“尾元素的下一位置”的迭代器。 

end 成员返回的迭代器通常称作”尾后迭代器”,或简称为尾迭代器,这样的迭代器没有实际意义,通常作为标记使用

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


【迭代器支持的运算符运算:

*iter
iter->mem // 解引用iter 并获取该元素的名为mem 的成员,等价于(*iter).mem{括号不能省略,省略后会将iter.mem 看做一体},使用箭头运算符可避免这一问题
++iter
--iter
iter1 == iter2
iter1 != iter2
和指针类似, 也能通过解引用迭代器来获取它所指示的元素,但要求该迭代器必须合法并确实指向某个元素(尾后迭代器和无效迭代器无法解引用)。

从逻辑上说,迭代器的递增递减与整数类似,不过不是在值上加减,而是将迭代器“向前或向后移动一个位置”。(指针的递增递减同理)

当迭代器被用进条件表达式时,尽量使用“==”或“!=”而非(<, >, <=, >=),因为标准库类型的迭代器都支持前者,却并不都支持后者,所以养成在迭代器中使用前者的习惯。】


【实际上,使用iterator 和const_iterator 来表示迭代器的类型:

vector<int>::iterator iter1;
vector<string>::const_iterator iter2;
其中const_iterator 和指向常量的指针相似,能读取但不能修改它指向的元素的值是底层常量而非顶层常量常量对象只能用const_iterator,非常量两者都可使用
begin 和end 的返回值由对象是否为常量决定,如果对象是常量,返回const_iterator,否则返回iterator。

当明确我们的操作只需读取无须写入的话,最好使用常量类型,此时可用c++11 新标准引入的cbegincend,无论对象是否为常量,这两个函数的返回值一定是const_iterator。】


【vector 对象能动态增长的特性导致一些使用上的限制,如:任何一种可能改变vector 对象容量的操作(push_back),都会使该vector 对象的迭代器失效。(9.3.6节是否改变vector 对象的容量使其整体在内存中的位置也发生了改变)】


3.4.2 迭代器运算


【比起标准库的其他容器, vector 和string 的迭代器提供了更多额外的运算符,可以使迭代器每次移动跨过多个元素或进行关系运算:
iter + n // 迭代器加上一个整数值仍是迭代器,相比原位置向前移动了n 个元素
iter - n // 同上
iter += n
iter -= n
iter1 - iter2 // 两个迭代器相减的结果是它们之间的距离,参与运算的两个迭代器必须指向的是同一个容器中的有效位置(元素位置或尾后位置)
>, <, <=, >= // 比较两个迭代器的位置,称靠前者小于靠后者,参与运算的两个迭代器必须...同上
两个迭代器相减,在运算有效的情况下,返回值是difference_type 的带符号整形数。】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值