首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

反向迭代器

在官方库中,反向迭代器是使用适配器封装的,即用普通的迭代器去作为适配器,然后封装出一个反向迭代器出来。  关于迭代器的解析,在介绍实习list以及迭代器这篇文章中有较详细讲解。...此处重点是反向迭代器的原理和实现。list---迭代器的原理和实现 开始实现反向迭代器 首先是类模板,Iterator代表的是适配器,Ref和Ptr代表的是引用和取地址。...++和--,即往后走和往前走: 正向迭代器的++/--,即是反向迭代器的--/++: 因为是通过正向迭代器作为适配器的,当it进行++或--的时候,就会去调用正向迭代器中的operator++()和operator...{ ++it;//会调用正向迭代器的operator++(); return *this; }  反向迭代器的解引用 根据官方库中的源代码,我们可以分析得到,反向迭代器中的rbegin和rend...Ptr operator->() { return *(operator*()); } 反向迭代器的构造函数 只需在初始化列表上,将迭代器指向的节点或顺序表中的某个位置赋值给反向迭代器的对象即可

49020
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    插入、流和反向迭代器

    print(v2); return 0; } 上面的代码结果如下: 1 2 3 666 777 666 777 1 2 3 3 2 1 666 777 1 2 3 将vec中的元素分别用三种插入迭代器进行不重复复制的时候就可以看到三种迭代器的不同之处...(cout," ")); return 0; } 这样来循环都不用写了,用copy就能完成输出,上面的输出流也能重新绑定, 反向迭代器 类型和操作 反向迭代器是在容器中从尾部元素向首部元素反向移动的迭代器...除了forward_list之外其他容器都支持反向迭代器。 反向迭代器有rbegin,rend,crbegin和crend; 四种迭代器指向的容器位置如下所示: ?...string的字符,因为反向迭代器会反向操作容器中的元素。...反向迭代器可以用自带的base成员函数来转换为一个普通正向迭代器; string str = "apple,dinner"; cout << string(str.crend().base(),

    50120

    【C++】开始了解反向迭代器

    然而,当我们面临实现反向迭代器的需求时,是否需要重头开始,再次进行类的封装呢? 显然这种做法并非必要(不然就要手搓无数个反向迭代器了)。...因为反向迭代器与正向迭代器在功能上存在高度一致性,唯一的区别在于它们在容器中的移动方向相反。因此,我们可以采用适配器设计模式,对现有的正向迭代器进行二次封装,以此满足反向迭代器的需求。...接下来我们也来实现一下自己的反向迭代器: 3 复刻反向迭代器 通过对反向迭代器的设计模式的了解,我们可以大致写一个框架: namespace bit { // 适配器 -- 复用 //给谁的正向迭代器就产生谁的正向迭代器...3.1 加减操作 根据反向迭代器的性质,我们可以借助正向迭代器的函数来实现反向迭代器的加减操作。...因为为了与正向迭代器对称,反向迭代器的开始位置并不是结尾,而是哨兵位。 下面这种可以直接使用已有的end() , begin()函数进行复用,增加代码可读性。所以对应的访问方式就要减一再访问。

    15010

    初识C++ · 反向迭代器简介

    我们实现const迭代器的时候,有两种路,一是直接来一个类,二是通过模板,非const迭代器的复用来实现的,同理,我们实现反向迭代器的话,也可以每种结构都来一个单独的反向迭代器的类,但是科学家们觉得太麻烦了...,所以把反向迭代器的高度拉的很高,高到什么程度呢?...反向迭代器的实现 我们大思路是通过判断传的迭代器的不同,调用对应正向迭代器的函数,所以我们创建的反向迭代器的类的成员变量是iterator,实现的接口还是那么几个,!...第一个参数是迭代器,也就是判断复用谁的迭代器,第二个参数是引用,第三个参数是指针类型。 这里需要引入一个问题 这是我们没真正接触反向迭代器之前所猜想的反向迭代器结构。...list vector中反向迭代器的应用 注意,这里实现的反向迭代器是个简单版本,只适用于list和vector。

    9710

    【c++】反向迭代器的探究实现

    ,我们下面来实现另一种适配模式,我传入某一容器的正向迭代器来适配生成反向迭代器 比如传入List类的正向迭代器,适配出List的反向迭代器,传入vector正向迭代器,适配出vector的反向迭代器 template...= 总结编译器处理: 本来每个容器都要写一个反向迭代器的累,但是自己写,太费劲了 本质写一个反向迭代器的类模板,给编译器传不同的容器的正向迭代器实例化,编译器帮助我们实例化出各种容器的对应反向迭代器...编写一个通用的反向迭代器类模板可以省去为每个容器单独定义反向迭代器的麻烦。...它接收一个正向迭代器作为模板参数,反转了其遍历方向,使得利用正向迭代器的容器可以很容易地提供反向迭代能力 使用类模板可以使得编译器根据你向模板传递的不同正向迭代器类型,为每个具体的容器类型生成对应的反向迭代器实例...()); ++rIt) { std::cout << *rIt << " "; } 在这段代码中,ReverseIterator 对 std::vector::iterator 类型进行了实例化

    11910

    C++ STL学习之【反向迭代器】

    iterator _start; //指向起始位置 iterator _finish; //指向有效元素的下一个位置 iterator _end_of_storage; //指向可用空间的下一个位置 }; 通过反向迭代器进行遍历...= v.rend()) { cout << *rit << " "; ++rit; //反向迭代器++,就是-- } cout << endl; } 可以成功使用反向迭代器进行遍历...empty_init() { _head = new node; _head->_prev = _head->_next = _head; } node* _head; //哨兵位节点 }; 通过反向迭代器对自定义类型数据进行遍历...vector(反向迭代器版) list(反向迭代器版) ---- 总结 以上就是本篇关于 C++ STL 学习之【反向迭代器】的全部内容了,在本篇文章中,我们主要学习了反向迭代器类的思想及实现,最后分别用了...vector 和 list 进行了测试,成功实现了反向遍历 如果你觉得本文写的还不错的话,可以留下一个小小的赞,你的支持是我分享的最大动力!

    15920

    【STL】reverse_iterator反向迭代器的实现

    而反向迭代器则与正向迭代器的遍历方向相反,从后往前反向遍历。...如下为其基本结构: 2.1.1、构造函数 构造函数的实现很简单,直接根据传入的参数进行构造即可: 2.1.2、++与-- 反向迭代器的遍历与正向迭代器完全相反,正向迭代器的++操作,是从前往后的,因此对于反向迭代器来说就相当于自己的...3、反向迭代器的应用 3.1、应用于list 这里我们可以对其进行使用,我们可以放在我们前文所实现的list中使用:在使用时需包含我们这里写的反向迭代器的头文件,同时在list中实现rbegin与rend...,我们在上文已经讲过了,rbegin与end对应,rend与begin对应: 接下来我们对其进行测试: 3.2、应用于vector 当然,我们也可以将我们写的反向迭代器放到vector中去用,用法相同...: 同样,我们进行测试: 至此我们之前所写的list与vector都支持了反向迭代器版本。

    13110

    【Kotlin 协程】Channel 通道 ② ( Channel 通道容量 | Channel 通道迭代 | 使用 iterator 迭代器进行迭代 | 使用 for in 循环进行迭代 )

    文章目录 一、Channel 通道容量 二、Channel 通道迭代 1、使用 iterator 迭代器进行迭代 2、使用 for in 循环进行迭代 一、Channel 通道容量 ---- Channel...---- Channel 通道 其 本质是一个 先进先出 队列 ; 1、使用 iterator 迭代器进行迭代 可以使用 Channel#iterator 对 Channel 通道 进行 迭代 ; 首先..., 调用 channel.iterator() 获取迭代器 ; 然后 , 调用 iterator.hasNext() 检查是否有下一个元素 , 最后 , 调用 iterator.next() 获取下一个元素...kim.hsl.coroutine I 从通道中获取数据 2 21:48:06.887 System.out kim.hsl.coroutine I 从通道中获取数据 3 2、使用 for in 循环进行迭代...使用 for in 循环 对 Channel 通道进行迭代 , 核心代码如下 : for(num in channel) { delay(1000) println("从通道中获取数据

    75410

    【C++】STL——反向迭代器的模拟实现:迭代器适配器

    前言 反向迭代器的使用相信大家都已经比较熟悉了,那我们这篇文章具体讲什么呢? ,这篇文章我们重点来讲一下反向迭代器的模拟实现。 那为什么我们之前不和正向迭代器放在一块讲呢?...即reverse_iterator 是对普通的正向迭代器进行了一个适配,进行了一个封装。 但是库里面实现的是比较复杂的,涉及一个迭代器萃取的东西,这个我们可以不用管。 我们后面实现会简化一点。...,那接下来就给大家解释一下这样做真正的牛逼之处: 大家想一下,对于我们的list来说,我们使用最开始我们自己的方法去实现反向迭代器(拷贝一份正向迭代器的代码,进行一些简单修改),确实也可以。...但是对于适配器的实现方式: 你给我一个list的正向迭代器,我可以给你适配出list的反向迭代器,那如果给一个vector的正向迭代器,能否适配出vector的反向迭代器呢?...那我们这里的迭代器适配器Reverse_Iterator是不是只要对应容器的迭代器支持++和–操作就可以进行适配啊。

    18210

    【STL】iterator adapters_反向迭代器的实现

    而反向迭代器则与正向迭代器的遍历方向相反,从后往前反向遍历。...如下为其基本结构: 2.1.1、构造函数 构造函数的实现很简单,直接根据传入的参数进行构造即可:  2.1.2、++与-- 反向迭代器的遍历与正向迭代器完全相反,正向迭代器的++操作,是从前往后的,...3、反向迭代器的应用 3.1、应用于list 这里我们可以对其进行使用,我们可以放在我们前文所实现的list中使用:在使用时需包含我们这里写的反向迭代器的头文件,同时在list中实现rbegin与rend...,我们在上文已经讲过了,rbegin与end对应,rend与begin对应:  接下来我们对其进行测试: 3.2、应用于vector 当然,我们也可以将我们写的反向迭代器放到vector中去用,用法相同...:  同样,我们进行测试:  至此我们之前所写的list与vector都支持了反向迭代器版本。

    20820

    Oracle基础教程之反向键索引

    反向键索引是一种B-tree索引,它在保持列顺序的同时,物理地改变每个索引键的字节(反向键索引除了ROWID和still之外,反转每个索引列的字节)。...例如,如果索引键为20,如果在十六进制中存储为这个键的两个字节是C1,则是标准b树索引中的15个字节,那么一个反向键索引将字节存储为15,C1。 优点: 反转键解决了b树索引右侧叶块争用的问题。...在反向键索引中,字节顺序的反转分布在索引中的所有叶键上。例如,在标准键索引中相邻的20和21这样的键现在被分开存储在不同的块中(索引会在左边,中间,右边-到处都是)。所以争论就这样消失了。...因此,顺序键插入的I/O分布更均匀。 缺点: 但是,必须指出的是:现在整个索引最好在缓冲区缓存中,而在之前——只有热的右侧需要在缓存中进行有效的插入。...由于索引中的数据在存储时没有按列键排序,所以反向键安排在某些情况下消除了运行索引范围扫描查询的能力。

    54310

    【C++】STL 容器 - set 集合容器 ② ( set 集合容器常用 api 简介 | 使用迭代器进行正向迭代与反向迭代 | 集合容器插入元素 | 插入单个元素 | 插入多个元素 )

    一、set 集合容器遍历 1、使用迭代器进行正向迭代与反向迭代 std::set 集合容器 提供了 begin、end、rbegin 和 rend 这几个成员函数,用于 获取 迭代访问链表中的元素 的...end() const; 获取指向尾元素的反向迭代器 : 该函数返回一个反向迭代器 , 指向集合容器的最后一个元素 ; 如果集合容器为空 , 则此操作未定义 ; 反向迭代器从集合的尾部向头部移动 ;...获取指向首元素之前的反向迭代器 : 返回一个反向迭代器 , 指向集合的 超出头部 ”的位置 , 即第一个元素的前一个位置 ; 该迭代器 它用于与 rbegin 一起实现完整的逆向迭代 ; reverse_iterator...= se.end(); it++) { cout << *it << " "; } // 回车换行 cout << endl; 反向迭代示例 : // 遍历 set 集合容器 , 反向迭代...集合容器中 ; 函数原型如下 : 使用初始化列表来插入多个元素 void insert (initializer_list init); 插入多个元素时 , 会将多个元素与原有元素进行排序

    98110

    【C++STL】list(常见接口、模拟实现、反向迭代器)

    list的常见接口 对迭代器的封装 因为list的空间不是连续的,不能用原生指针,必须对其进行封装。 节点 重载-> 当数据是自定义类型时,想通过->访问,就必须重载。...下面是进行的优化: 本质相当于写了一个类模板,编译器实例化生成了两个类。...list与vector的对比 反向迭代器 反向迭代器的++就是正向迭代器的--,反向迭代器的--就是正向迭代器的++,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行...反向迭代器完整代码 #pragma once //所以容器的反向迭代器 //迭代器适配器 namespace qjh { //vector::iterator template //给谁的正向迭代器,就适配出对应的反向迭代器 struct ReverseIterator { typedef ReverseIterator

    15710

    c++stl之反向迭代器用法及注意事项!!!

    反向迭代器 1.定义: 在容器中从尾元素向首元素反向移动的迭代器 对于反向迭代器,递增和递减的含义会颠倒过来 递增一个反向迭代器会移动到前一个元素 递减一个迭代器会移动到下一个元素...crend() 下面两个c开头的是反向迭代器的const版本,即不能修改迭代器指向位置的值 3.反向迭代器与正向迭代器的比较 4.反向迭代器应用之逆序打印数组元素 vector vec...我们只能从既支持++也支持–的迭代器来定义反向迭代器....毕竟反向迭代器的目的是在序列中反向移动。...反向迭代器的目的是表示元素范围,而这些范围是不对称的,这导致一个重要的结果: 当我们从一个普通迭代器初始化一个反向迭代器,或是给一个反向迭代器赋值时,结果迭代器与原迭代器指向的并不是相同的元素。

    1.1K30
    领券