欢迎光临散文网 会员登陆 & 注册

C++ 迭代器

2023-03-23 20:35 作者:S-a-i_  | 我要投稿

除了下标之外我们还可以用一种更加通用的方法来实现对vector等对象的访问,这就是迭代器,后面我们还会介绍标准库中的其他集中容器,他们都可以使用迭代器,但是只有少数支持下标访问。

迭代器和指针类似,可以访问某个元素,也能在元素中移动。迭代器有有效和无效之分,这一点和指针差不多,有效迭代器要么指向某个元素,要么指向容器中的下一个元素,否则就是无效的。



使用迭代器

和指针不一样的时,迭代器不是使用取址符,有迭代器的类型同时拥有返回迭代器的成员。比如这些类型都拥有名为begin和end的成员,其中begin成员负责返回指向第一个元素的迭代器。

也就是说end成员指示的是容器的一个本不存在的“尾后”元素。这样的元素就是一个我们已经处理完毕所有元素的标记。end成员返回的迭代器通常被称为“尾后迭代器”,或者简称为“尾迭代器”。特殊情况下如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。



迭代器运算符

简单的使用一下运算符

end返回的迭代器并不实际指示某个元素,所以不能对其使用递增或者解引操作。



迭代器类型

就像size_type类型一样,一般来说我们也不用知道迭代器的精确类型,实际上那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型

如果vector对象或者string对象是一个常量,只能使用const_iterator。



迭代器和迭代器类型

迭代器有三个不同含义:

  1. 迭代器概念本身

  2. 容器定义的迭代器类型

  3. 某个迭代器对象

重点是理解存在一组概念上相关的类型,我们认定某个类型是迭代器当且仅当它支持一套操作,这套操作是我们能访问容器的元素从某个元素移动到另一个元素。每个容器类定义了一个名为iterator的类型,该类型支持迭代器概念所规定的一套操作。



begin和end运算符

begin和end的类型由对象是不是常量决定,如果是那返回const_iterator,否则返回iterator。

c++11的标准中有两个函数,cbegin和cend,不论vector对象是不是常量,返回值都是const_iterator。



结合解引和成员访问操作

这里使用最后一行*vb外的括号必不可少,具体原因会在后面解释,这里只用知道,如果不加括号点运算符将由vb来执行,而非vb解引后的结果。这样的情况我们可以用箭头运算符->来运算,(*vb).pos和vb->pos的意义相同。



对某些vector对象的操作会使迭代器失效

已知的一个是不能在范围for中向vector对象添加元素。另外一个就是任何一种可能改变vector对象容量的操作比如push_back都会使vector对象的迭代器失效,后面我们会详细解释他们如何失效的。



迭代器运算

只要两个迭代器指向的是同一个容器的元素或者尾元素的下一个位置,就可以相加减,得到的是一个difference_type的带符号整型数。





C++ 迭代器的评论 (共 条)

分享到微博请遵守国家法律