迭代器

迭代器 iterator 是一种访问容器成员的通用机制。
string 也可以通过迭代器访问。
所有的标准容器都可以使用迭代器,但是其中只有少数几种才能同时支持下标运算符。严格来说,string 对象不属于容器类型,但是 string 支持很多与容器类型类似的操作。

使用迭代器

获取迭代器不是取地址符,有迭代器的类型同时拥有返回迭代器的成员。比如,这些类型都拥有名为 begin 和 end 的成员,其中 begin 成员负责返回指向第一个元素(或第一个字符)的迭代器。end 成员负责返回指向容器(或 string 对象)“尾元素的下一位置 (one pass the end)”的迭代器。也就是说,该迭代器指示的是容器的一个本不存在的**尾后 (off the end) **元素。 end 成员返回的迭代器常被称为 尾后迭代器 (off-the-end iterator) 或者简称为尾迭代器 (end iterator)。
值得注意的是,如果迭代器为空,那么 begin 和 end 返回的都是尾迭代器。

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

迭代器的移动
迭代器使用递增 (++) 运算符,来从一个元素移动到下一个元素。通过递减 (--) 从一个元素移动到上一个元素。
同时,因为 end 返回的迭代器并不实际上指示某个元素,所以不能对齐进行递增或者解引用的操作。

for(auto it = s.begin(); it != s.end() && !isspace(*it); it++){
	*it = toupper(*it);
}

这是一段能将 string 对象的第一个单词转换成大写的程序
原来 C 的程序员会对 for 循环中使用 != 而非 < 判断有点儿奇怪。C++ 使用 != 因为这种编程风格在标准库提供的所有容器上都有效。
只要我们养成了迭代器和 != 的习惯,就不用太在意用的到底是哪种容器类型。
箭头运算符
箭头运算符 -> 把解引用和成员访问两个操作结合在一起,也就是说,it->item 和 (*it).mem 表达的意思相同。
虽然 vector 对象可以动态地增长,但是也会有一些副作用。已知的一个限制是不能在范围 for 循环中向 vector 对象添加元素。另外一个限制是任何一种可能改变 vector 对象容器的操作,比如 push_back,都会使该 vector 对象的迭代器失效。
但凡是使用了迭代器的循环体,都不要向迭代器所属的容器中添加元素。

迭代器运算

迭代器的递增运算可以让迭代器每次移动一个元素,所有的标准库容器都有支持递增运算的迭代器。类似的也可以使用 == 和 != 对标准库容器中的迭代器进行比较。
在 string 和 vector 的迭代器支持更多的运算:允许跨越多个元素,另外也支持关系运算。所有这些运算都被称为 迭代器运算 (iterator arithmetic)

vector 和 string 迭代器支持的运算
iter + n 迭代器加上一个整数值仍得一个迭代器,迭代器指示的新位置与原来相比向前移动了若干个元素。结果迭代器或者指示容器内的一个元素,或者指示容器尾元素的下一位置
iter - n 迭代器减去一个整数值仍得一个迭代器,迭代器指示的新位置与原来相比向后移动了若干个元素。结果迭代器或者指示容器内的一个元素,或者指示容器尾元素的下一位置
iter += n 迭代器的加法复合语句,将 iter 加 n 的结果赋给 iter
iter -= n 迭代器的减法复合语句,将 iter 减 n 的结果赋给 iter
iter1 - iter2 两个迭代器相减的结果是它们之间的距离,也就是说,将运算符右侧的迭代器向前移动差值个元素后将得到左侧的迭代器。参与运算的两个迭代器必须指向的是同一个容器中的元素或者尾元素的下一个元素
>、>=、<、<= 迭代器的关系运算符,如果某迭代器指向的容器位置在另一个迭代器所指向的位置之前,则说明前者小于后者。参与运算的两个迭代器必须指向的是同一个容器中的元素或者尾元素的下一个元素

其实前后大小关系可以参考下标的位置。对应下标大的迭代器大于对应下标小的迭代器,尾迭代器是最大的。
迭代器相减的结果是一种 difference_type 的带符号的整数,可负可正
迭代器相加会导致编译错误,不支持的运算

posted @ 2023-04-06 19:31  文工程序  阅读(41)  评论(0编辑  收藏  举报