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

反向迭代器

在官方库中,反向迭代器是使用适配器封装的,即用普通的迭代器去作为适配器,然后封装出一个反向迭代器出来。  关于迭代器的解析,在介绍实习list以及迭代器这篇文章中有较详细讲解。...list---迭代器的原理和实现 开始实现反向迭代器 首先是类模板,Iterator代表的是适配器,Ref和Ptr代表的是引用和取地址。...operator--() { ++it;//会调用正向迭代器的operator++(); return *this; }  反向迭代器的解引用 根据官方库中的源代码,我们可以分析得到,反向迭代器中的...Ref operator*() { Iterator tmp = _it; return *(--tmp); } 对于operator->(),返回的是数据的地址,我们可以使用operator...const_reverse_iterator(begin()); } //反向迭代器的rbegin() reverse_iterator rbegin() { //通过end()返回链表的哨兵头节点

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

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

---- 前言 适配器模式是 STL 中的重要组成部分,在上一篇文章中我们学习了 容器适配器 的相关知识,即 stack 与 queue,除了 容器适配器 外,还有 迭代器适配器,借助 迭代器适配器,可以轻松将各种容器中的普通迭代器转变为反向迭代器...,这正是适配器的核心思想 ---- ️正文 反向迭代器适用于所有的容器,因此它是作为一个单独的 .h 文件出现的,别的容器如果想使用,直接包含就行了 1、反向迭代器设计 反向迭代器 reverse_iterator...*() 时,需要返回目标对象引用使用 Ref;同理,在涉及 operator->() 时,需要返回目标对象指针,使用 Ptr 具体返回对象(引用 / 指针)是否为 const 修饰,取决于调用方 1.3...、极致对称 在反向迭代器类中,有一个十分奇怪的函数 operator*(),它返回的并非当前所指向的对象,而且上一个对象 Ref operator*() { Iterator tmp = _cur;..._cur); } }; } 编写完成此头文件 reverse_iterator.hpp 后,任何具有正向迭代器的容器,都可以利用迭代器适配器,适配出属于自己的反向迭代器 具体使用例子可以接着往下看

12920

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

其实区别好像也不是很大,就是正向迭代器的++是从前往后走,而反向迭代器的++是后往前走,那对于list来说正向++是_node = _node->_next;,那反向就应该是_node = _node...它的解引用怎么不是返回当前结点的值啊,为什么返回的是- 1之后再解引用的值? 那按照我们上面的分析和理解,除了++和- -这些操作之外,其它的解引用,判断相等不相等这些是不是可以不用动啊。...就是上面我们看到的: 它的解引用是不是返回的是-1之后的值啊,正向迭代器-1就是取prev嘛,头结点的prev是不是就正好是最后一个元素啊。...然后我们实现一下解引用*: 那我们这里按库里面走,经过上面我们的分析我们知道这里解引用返回的是- -之后的值。 这样做。...但是这里的返回值是不是有点难搞啊,普通对象解引用返回引用,const对象解引用返回const引用。 那这个问题我们之前是不是提出了比较好的解决方式啊,可以增加一个模板参数去控制。

12710

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

tmp,然后对 tmp 应用前置自减 operator--,将其后移一,然后解引用。...,然后取地址得到对应元素的指针 编译器会生成代码,使用上面定义的解引用操作符 operator* 来获取一个引用,然后获取该引用的地址 4....编译器调用 _it 的前置自减操作符 operator-- 并返回 *this 实现反向迭代器的自增操作 5....编译器调用 _it 的前置自增操作符 operator++ 并返回 *this 实现反向迭代器的自减操作 6. 不等于操作符 operator!=: bool operator!...这个通用反向迭代器适配器遵循了一种 编写一次,处处使用的原则,极大地提高了代码的复用性 例如,在 ReverseIterator 模板中,只要定义一次,就可以用来产生各种支持正向迭代器的容器的反向迭代器

9310

C++ 中的随机标头系列1

它是一个状态大小为 19937 的 32 位数字的伪随机生成器。 operator(): 它生成一个随机数。该函数使用转换算法将内部状态更改一个,该算法会在所选元素上产生扭曲。...标准发电机ranlux24和ranlux48使用适配器适应subtract_with_carry_engine。 operator(): 它返回一个新的随机数。...operator(): 它返回一个新的随机数。 引擎的转换算法根据需要多次调用基础引擎的 operator() 成员,以获得足够的有效来构造随机值。...该对象在内部保留一个由 k 个生成的数字组成的缓冲区,并在请求时返回缓冲区内随机选择的数字,并将其替换为其基本引擎获得的值。 operator(): 它返回一个新的随机数。...引擎的转换算法在内部表中选取一个值(由函数返回),并将其替换为其基础引擎获得的新值。 max: 它返回operator()给出的最大值。 最小值: 它返回 operator() 给出的最小值。

1.3K10

容器适配器之stack,queue和优先级队列---基于List实现的链栈,链队列,优先级队列

适配器: 以某种既有的容器作为底部结构,定义新的接口,使之成为具有某种特殊用途的容器,这种具有新接口的容器称为适配器。...=(l); } //赋值运算符重载 const List& operator=(const List& L); //迭代器中的转换构造是在begin和end函数里面使用的...End() { return iterator(tail); } const_iterator End()const { return const_iterator(tail); } //返回首元素引用...---我们在迭代器的函数里面重载了*,因此解引用迭代器返回的是当前迭代器的current指针指向的data数据域 T& front() { return *Begin(); } const...T& front() const { return *Begin(); } //返回尾元素引用---我们在迭代器的函数里面重载了*,因此解引用迭代器返回的是当前迭代器的current指针指向的

47620

C++ 中的容器类详解

以下为整个列表概述: 标准容器类 说明 顺序性容器 vector 后面快速的插入与删除,直接访问任何元素 deque 从前面或后面快速的插入与删除,直接访问任何元素 list 双链表,任何地方快速插入与删除...operator== 如果第一个容器等于第二个容器,返回true,否则返回false operator!...= 如果第一个容器不等于第二个容器,返回true,否则返回false swap 交换两个容器的元素 其中operator>,operator>=,operator<,operator<=,operator...或const_iterator,引用容器最后一个元素后面一 rbegin 该函数两个版本返回reverse_iterator或const_reverse_iterator,引用容器最后一个元素 rend...该函数两个版本返回reverse_iterator或const_reverse_iterator,引用容器第一个元素前面一 erase 从容器中清除一个或几个元素 clear 清除容器中所有元素

77720

C++(STL3)容器适配器(1) stack,queue and priority_queue

下面是 stack 容器可以提供的一套完整操作: top():返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。 push(const T& obj):可以将对象副本压入栈顶。...对于任何需要用 FIFO 准则处理的序列来说,使用 queue 容器适配器都是好的选择。 ?...如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 back():返回 queue 中最后一个元素的引用。...如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 push(const T& obj):在 queue 的尾部添加一个元素的副本。...top():返回优先级队列中第一个元素的引用。 pop():移除第一个元素。 size():返回队列中元素的个数。 empty():如果队列为空的话,返回true。

65430

dotnet 使用 Refasmer 现有的 DLL 里面导出公开的成员组装出新的仅作为引用用途的程序

本文告诉大家 Resharper 家(JetBrains)开源的 Refasmer 工具,这个工具的功能就是现有的 DLL 或 EXE 程序里面,将所有的公开成员导出,重新打出新的 DLL 或 EXE...此时打出的新的程序里面的方法都不包含实现,而是只有定义,这样的程序被成为仅作为引用用途的程序,也就是 Reference assemblies 的意思,这也就是 Refasmer 命名来源 这个...DLL 来测试一下用途,如我有一个叫 Lindexi.dll 文件,我采用如下命令行进行转换为仅作为引用用途的程序 refasmer Lindexi.dll 输入上面代码之后,将会在相同的文件夹下生成...在 dnspy 上可以看到 refasm.dll 里面只有方法的定义和属性的定义,但是没有任何具体的实现 这样的仅作为引用用途的程序可以方便用在某些插件开发 SDK 或者某些不支持的版本上,用于构建用途...或者用在某些超大项目上,用于支持超大解决方案里面单个项目的独立构建 和 dotnet 自带的 ProduceOnlyReferenceAssembly 不同之处在于 Refasmer 可以 DLL 里面导出仅作为引用用途的程序

56720

C++初阶-stackqueuepriority_queue的使用和模拟

top() 返回栈顶元素的引用 push() 将元素val压入stack中 pop() 将stack中尾部的元素弹出 例题1:用栈实现队列 力扣链接:232....,queue提供一组特定的成员函数来访问其元素;元素队尾入队列,队头出队列 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。...该底层容器应至少支持以下操作: empty:检测队列是否为空 size:返回队列中有效元素的个数 front:返回队头元素的引用 back:返回队尾元素的引用 push_back:在队列尾部入队列...,是返回true,否则返回false size() 返回队列中有效元素的个数 front() 返回队头元素的引用 back() 返回队尾元素的引用 push() 在队尾将元素val入队列 pop() 将队头元素出队列...容器应该可以通过随机访问迭代器访问,并支持以下操作: ​ empty():检测容器是否为空 ​ size():返回容器中有效元素个数 ​ front():返回容器中第一个元素的引用 ​ push_back

30220

C++ STL (标准模板库) 详细内容讲解

顺序容器还有以下常用成员函数: front():返回容器中第一个元素的引用。 back():返回容器中最后一个元素的引用。 push_back():在容器末尾增加新元素。...容器适配器都有以下三个成员函数: push:添加一个元素。 top:返回顶部(对 stack 而言)或队头(对 queue、priority_queue 而言)的元素的引用。...它和普通队列的区别在于,优先队列的队头元素总是最大的——即执行 pop 操作时,删除的总是最大的元素;执行 top 操作时,返回的是最大元素的引用。...append 成员函数返回对象自身的引用。(其实就是在一个字符串后面追加一个字符串)。...replace 成员函数可以对 string 对象中的子串进行替换,返回值为对象自身的引用

2K10

【stack】【queue】【priority_queue】【deque】详解

2.stack的使用 函数说明 接口说明 stack() 构造空的栈 empty() 检测 stack 是否为空 size() 返回 stack 中元素的个数 top() 返回栈顶元素的引用 push(...队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue 提供一组特定的 成员函数来访问其元素。元素队尾入队列,队头出队列。...该底层容器应至少支持以下操作: empty: 检测队列是否为空 size: 返回队列中有效元素的个数 front: 返回队头元素的引用 back: 返回队尾元素的引用 push_back: 在队列尾部入队列...返回队列中有效元素的个数 front() 返回队头元素的引用 back() 返回队尾元素的引用 push() 在对尾将元素 val 入队列 pop() 将队头元素出队列 代码演示: queue #include...val填充 增删查改 reference operator[](size_type n); //返回deque中n位置上元素的引用 reference front

79330

学了C++不会STL,简直少了左膀右臂

; 仿函数(Functor) 适配器(Adaptor) 分配器(allocator) 仿函数、适配器、与分配器用的比较少,甚至没用过!...后置自减迭代器 随机迭代器 p+=i 将迭代器递增i p-=i 将迭代器递减i p+i 在p加i后的迭代器 p-i 在p减i后的迭代器 p[i] 返回p位元素偏离i的元素引用 p<p1...函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。 4、this。...重载版本使用自定义的比较操作。 set_symmetric_difference: 构造一个有序序列,该序列取两个序列的对称差(并-交集)。...重载版本使用自定义比较操作。 pop_heap: 并不真正把最大元素堆中弹出,而是重新排序堆。它把first和last-1交换,然后重新生成一个堆。

77520

【c++】stack和queue使用 && stack和queue模拟实现

deque 1.2 stack的使用 1.3 stack的模拟实现 栈的接口中可以看出,栈实际是一种特殊的vector,因此使用vector完全可以模拟实现stack #include<vector...元素队尾入队列,队头出队列 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。...该底层容器应至少支持以下操作: empty:检测队列是否为空 size:返回队列中有效元素的个数 front:返回队头元素的引用 back:返回队尾元素的引用 push_back:在队列尾部入队列...容器应该可以通过随机访问迭代器访问,并支持以下操作: empty():检测容器是否为空 size():返回容器中有效元素个数 front():返回容器中第一个元素的引用 push_back():...容器适配器 4.1 什么是适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口 4.2

8810

10.1 C++ STL 模板适配与迭代器

10.1 函数对象适配器 Bind2nd 是一个函数适配器,可以用来将一个双参函数转换成一个单参函数。使用适配器可以修改函数中的第二个参数,而将第一个参数保持不变。...使用ptr_fun的一般步骤为: 在定义函数时,将函数声明为普通函数类型。 在使用ptr_fun适配器时,通过参数列表将想要转换的函数名作为参数传入ptr_fun中。...在使用not1这个适配器时,需要注意函数对象必须是一个一元谓词,也就是说,只接受一个参数并返回布尔值的函数对象。适配后的新函数对象接受一个参数,它的返回值取决于原函数对象的返回值,并将其取反。...); 其中Predicate是一个一元谓词,而返回值是一个封装了谓词的std::unary_negate对象,它是一个可调用的函数对象,并可以在STL的算法函数中使用。...这两种适配器都是在使用中间层的帮助下实现容器的插入操作,其主要作用是在输出迭代器(通常是一个容器)的末尾自动添加新的元素。

17910

疯子的算法总结(三) STL Ⅱ迭代器(iterator) + 容器

后置自减迭代器 随机迭代器 p+=i 将迭代器递增i p-=i 将迭代器递减i p+i 在p加i后的迭代器 p-i 在p减i后的迭代器 p[i] 返回p位元素偏离i的元素引用 p<p1...stack 不支持 适配器容器类型,用vector,deque或list对象创建了一个先进后出容器 queue 不支持 适配器容器类型,用deque或list对象创建了一个先进先出容器 priority_queue...不支持 适配器容器类型,用vector或deque对象创建了一个排序队列 二、容器 所有容器都支持自定义数据类型,就是结构体。...q.count() //返回有多少1 q.none() //所有都为0则返回true,至少1为1则返回false q.any()...//所有都为0则返回false,至少1为1则返回true,与函数none相反 q.set() //把所有变为1 q.set(k,v) //把第k变为

76820
领券