More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. daily
  3. 正文

Daily C/C++ 迭代器

2021年8月27日 572点热度 0人点赞 0条评论

Daily C/C++ 迭代器

迭代器相信平常用stl稍微多一点的同学肯定都很熟悉了,这篇文章就是介绍一下基本的迭代器的概念,帮助理解还不是那么清晰的同学理解一下迭代器的概念

参考文章

如果是从C转过来学习C++的同学可能会发现,迭代器就很像是指针一样。是的,迭代器就是在容器中对指针抽象的结果,所以迭代器可以看作是C++的指针,但是对于内存不连续的容器来说,迭代器其实是拓宽了原本指针的功能

那么首先明确,迭代器实际上是一个规范,即如果一个类型满足了如下几个条件,就可以被看作是一个迭代器

1.对象可以被拷贝构造,拷贝赋值和析构

2.对象支持*运算符,即得到迭代器对应的数据

3.对象支持前置的++运算符

我们平常使用的迭代器有着更加深入的规定,具体的

如果迭代器是作为右值,可读的,同时满足了后置的++运算符,那么这就是一个输入迭代器

但是输入迭代器只能单次访问对象,即读入一次就会移动到下一个。如果要求可以允许多次访问的话,那么就是一个前向迭代器

如果不仅支持++,同时支持了--,即既可以正向遍历,也可以反向遍历,那么就是一个双向迭代器

如果迭代器支持+,-,+=等运算符可以跳跃的移动迭代器,那么这就是一个随机访问迭代器

如果随机访问迭代器满足对象在内存中是连续存放的,那么这就是连续迭代器

上面说的都是作为右值,如果一个迭代器只能作为左值,那么这就是一个输出迭代器

我们可以想一下平常使用的迭代器,比如vector中的迭代器就是连续迭代器

对于迭代器来说,还有一个关系密切的概念,是基于range的for循环

就是我们平常用的for(type x : container)

那么他的底层到底是在做什么呢?

他会根据冒号后边范围表达式的结果,产生一个引用,同时自动便利这个范围的迭代器

循环内会自动生成根据左边的声明和*it来进行初始化的语句

对于C的数组,他会自动生成指向数组头尾的指针

对于有begin和end成员的对象,会调用对应的begin和end成员函数

否则他会在命名空间内查找可以用于该类型的begin和end函数

对于自己定义的迭代器,C++要求我们定义以下类型

class iterator {
public:
    typedef ptrdiff_t difference_type;
    typedef type value_type;
    typedef const value_type* pointer;
    typedef const value_type& reference;
    typedef input_iterator_tag
        iterator_category;
};

如果大家需要具体的实现迭代器,还是去cppreference参考,这里就不再多加赘述

这篇文章讲的很迷,大家可以再去看一下参考文章获得更多理解

标签: c++
最后更新:2021年8月27日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS