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

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

库里面反向迭代器的实现——迭代器适配器 ,我们来看一下库里面list的迭代器是如何实现的 我们看到,这里的反向迭代器包括const版本的,它们都是对reverse_iterator这个类模板的一个typedef...那reverse_iterator这个类模板的实现其实是在另一个头文件stl_iterator.h里面: 那reverse_iterator 这个类呢,其实是一个适配器,是一个迭代器适配器。...但是呢: 大家可能会提出这样的疑问: 我们后面的改进,按照适配器模式去重新实现,与之前我们自己的方法相比,好像也没有牛到那里去啊? 不还是需要我们自己手动去写一个类嘛。...(因为里面反向的++需要复用正向的- -,反向- -复用正向++) 所以,对于任何一个容器,只要迭代器至少是双向的,都可以用Reverse_Iterator这个类模板去适配出其反向的迭代器。...我Reverse_Iterator是一个类模板,你给我任何容器的正向迭代器,只要支持++和- -,我就给你适配出反向迭代器来。 ,这才是它真正的牛逼之处。 6.

18210

从零开始学C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员

一、迭代器 迭代器是泛型指针 普通指针可以指向内存中的一个地址 迭代器可以指向容器中的一个位置 STL的每一个容器类模版中,都定义了一组对应的迭代器类。...上面介绍的是vector::iterator ,比如 list::iterator 实现是类似的,内部成员也是一个指针,不过是指向Node 结点的指针,如: _Nodeptr _Ptr;// pointer...与前向迭代器相似,但是在两个方向上都可以对数据遍历 随机访问迭代器 也是双向迭代器,但能够在序列中的任意两个位置之间进行跳转 下图是不同类型的迭代器能够实现的操作: ?...map, set, list类型提供双向迭代器,而string, vector和deque容器上定义的迭代器都是随机访问迭代器,用作访问内置数组元素的指针也是随机访问迭代器。...众所周之当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此建议我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器进行正确的操作

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

    【C++】STL 容器 - vector 动态数组容器 ⑥ ( 使用迭代器遍历 vector 容器步骤 | 获取指容器向首元素的迭代器 begin 函数 | 获取末尾迭代器 | * 迭代器解引用 )

    > 类型的容器 , 其迭代器类型是 vector::iterator , 调用 vector 类的 begin() 函数 , 可获取 指向容器中 第一个元素的迭代器 ; vector...类的 end() 函数 , 可获取 指向容器中 最后一个元素的迭代器 , 判断当前的迭代器值 是否等于 最后一个元素的迭代器值 , 如果 不等于 继续迭代 , 如果等于 停止迭代 ; it !...二、 iterator 迭代器常用 api 简介 1、vector 容器类 begin 函数 - 获取指容器向首元素的迭代器 调用 vector 容器类 begin 函数 , 可以 获取指容器向首元素的迭代器...可以用来修改容器中的元素 ; 第二个重载版本函数 是 常量迭代器 , 不能用来修改容器中的元素 ; 返回的迭代器 可以使用 * 操作符进行解引用操作 , 获取迭代器指向的元素的值 ; 代码示例 : #include...修改 vector 容器后 , end() 函数返回的迭代器在容器被修改时不会自动更新 ; 如果 vector 容器中的元素发生了改变 , 需要重新调用 end() 函数来获取新的末尾迭代器 ; 代码示例

    2.9K10

    python中类迭代器的实现,代码优化的好东西

    ---- 本节知识视频教程 以下开始文字讲解: 一、迭代器 我们其实可以把迭代器看做集合,集合类似列表,但是迭代器的所消耗的内存资源要小于集合。...实际上一个类,只要有__iter__方法,那么这个类就是一个迭代器。 迭代器实现后,每一次迭代的返回结果在__next__方法中。...二、迭代器案例 下面我们通过一个实例来使用迭代器,视频教程中我们举例利用迭代器实现输出一个三角形的步骤思路: 1.写一个自定义类。 2.在类中实现一个__iter__方法,构造出迭代器。...3.再实现一个__next__方法,返回奇数个星号,获取迭代结果。 4.对于需要的一些变量,我们再次在__init__方法进行初始化。 5.实例化类的对象。 6.利用for循环输出自定义的迭代类。...三、总结强调 1.掌握迭代器的概念与意义。 2.掌握类来实现自定义迭代器。 3.掌握利用迭代器实现一个直角三角形。

    1K10

    【C++】STL 容器 - set 集合容器 ③ ( set 集合容器常用 api 简介 | 删除元素 | 删除指定值的元素 | 删除指定迭代器位置元素 | 删除指定迭代器范围元素 )

    文章目录 一、删除元素 1、删除指定值的元素 - erase 函数 2、删除指定迭代器位置的元素 - erase 函数 3、删除指定迭代器范围的元素 - erase 函数 4、删除集合中的所有元素 -...clear 函数 一、删除元素 1、删除指定值的元素 - erase 函数 在 C++ 语言的 STL 标准模板库 中 , set 集合容器 是一个有序的集合 , 存储的元素值都是唯一的 , 不重复的...迭代器 对象 , 作为参数 , 删除该迭代器指向的元素 ; 函数原型如下 : iterator erase (iterator position); 参数解析 : position 参数是一个指向要删除元素的迭代器...; 返回值解析 : 该函数的返回值是一个迭代器 , 指向被删除元素之后的下一个元素 ; 使用示例 : 在下面的示例中 , 删除了集合容器中的第二个元素 ; // set 集合容器 // 初始化列表中的顺序会自动排序...- erase 函数 调用 set#erase 函数 , 可以传入两个迭代器参数 , 这两个迭代器划定了本集合容器的一个范围 , 执行该函数可删除该范围的所有元素 ; 函数原型如下 : iterator

    76710

    C++容器list底层迭代器的实现逻辑~list相关函数模拟实现

    ,因此这个需要我们重新定义一个node的结构体,方便我们在这个list里面进行使用; 其中这个里面的list_node结构体里面包含的内容就是我们的data元素和next指针变量; 这个下面的list_node..._haed头结点的前驱指针和后继指针指向的都是自己; 2.实现push_back函数 为什么首先实现这个push_back函数,这个函数实现的就是向这个链表里面插入数据,我们想要使用迭代器进行遍历首先这个链表里面需要有数据...总结 因此,我们需要封装一个类,实现这个operator*和operator++的重载,进而可以让我们达到我们想要的效果; 4.迭代器类的封装 这个里面封装了我们的operator*和operator+...,发现这个迭代器就可以正常的跑起来了; 5.list容器里面其他函数的实现 首先就是这个insert和erase,即链表里面的数据的插入和删除; 插入数据的话,就是新建一个节点,在这个节点的前后和这个节点建立联系...,就可以实现相同的遍历的效果,因此,努力吧少年~我命由我不由天,努力奋进改尘寰~~我们要相信自己的努力,就是这个迭代器封装的类,我们最后也是会实现相同的效果的,list就是证明~~ 7.代码附录 //#

    5610

    通过一篇文章让你了解STL是什么

    ,包含了一系列模板类和函数,用于实现常见的数据结构和算法。...STL库主要由以下六大组件组成: 容器(Containers):提供了多种容器类模板,如vector、list、deque、set、map等,用于存储和管理数据。...算法(Algorithms):提供了一系列的算法函数模板,如排序、查找、合并、计数等,用于对容器中的数据进行操作和处理。...迭代器(Iterators):提供了一种通用的访问容器元素的方式,可以像指针一样遍历容器中的元素,支持前向、后向、双向和随机访问等不同的迭代器类型。...STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。 五、STL的缺陷 STL库的更新太慢了。

    1.1K11

    【C++】STL 容器 - STL 容器的值语意 ( 容器存储任意类型元素原理 | STL 容器元素可拷贝原理 | STL 容器元素类型需要满足的要求 | 自定义可存放入 STL 容器的元素类 )

    一、STL 容器的 值 ( Value ) 语意 1、STL 容器存储任意类型元素原理 C++ 语言中的 STL 容器 , 可以存储任何类型的元素 , 是因为 STL 容器 使用了 C++ 模板技术进行实现...; C++ 模板技术 是 基于 2 次编译实现的 ; 第一次编译 , 扫描模板 , 收集有关模板实例化的信息 , 生成模板头 , 进行词法分析和句法分析 ; 第二次编译 , 根据实际调用的类型 , 生成包含真实类型的实例化的代码..., 假如 在外部 该 指针 / 引用 指向的对象被回收 , 那么容器操作就会出现问题 ; STL 容器 中 , 存储的元素 , 必须是可拷贝的 , 也就是 元素类 必须提供 拷贝构造函数 ; 3、STL..., 这是容器操作的基础 ; 提供 重载 = 操作符函数 : STL 容器的元素可以被赋值 ; 4、STL 容器迭代器遍历 除了 queue 队列容器 与 stack 堆栈容器 之外 , 每个 STL...容器都可以使用 迭代器 进行遍历 ; 调用 begin() 函数 , 获取 指向 首元素 的迭代器 ; 调用 end() 函数 , 获取 末尾迭代器 , 该迭代器 指向 最后一个元素的后面位置 ; 除了

    15010

    【C++】探索STL中的高效容器:vector

    1.什么是STL C++标准模板库(Standard Template Library,简称STL)是C++的一个库,提供了一组通用的模板类和函数,实现了常用的数据结构和算法。...C++中的vector就是是标准模板库(STL)提供的一种容器。...容器可以存储不同类型的元素,并提供了一系列操作元素的函数,如插入、删除、查找、排序等。容器是STL最常使用的部分。 ✨迭代器(Iterators):用于遍历容器中的元素,类似于指针的概念。...✨算法(Algorithms):提供了一系列通用算法,如排序、查找、比较、复制、转换等。算法可以用于不同类型的容器,并且可以通过迭代器来操作容器中的元素。...2.vector介绍 C++中的vector是标准模板库(STL)提供的一种容器,用于存储和操作动态数组。

    13900

    C++实现 STL 标准库和算法(一)实验楼笔记

    STL 由算法,容器,迭代器,适配器,仿函数(函数对象),空间适配器六大部件组成 。我们将主要讲解容器,迭代器,算法和仿函数。适配器的部分会交给学员来实现,而空间适配器不会太过于深入。...这里的容器首先是一个模板类,在类中实现对数据的操作,而包含这样的类的实现就叫一个容器。...那么 STL 是怎么解决这个问题的呢?他们使用了迭代器(对指针的一种泛化)。迭代器底层是由指针实现的,是容器和算法的桥梁。...STL 里大多数容器都实现了自己的迭代器,我们可以使用迭代器来完成对容器的访问。后面我们会详细讲到迭代器的种类,性质,使用,实现。 5.适配器是啥呀?...8.总结一下呗 STL 是学习 C++ 路上必须领略的美景,STL 由六个部分组成: 容器, 迭代器, 算法, 仿函数, 适配器, 空间配置器。 各个部件相互调用,相互关联。

    1.7K20

    C++系列笔记(十一)

    (key);如果您使用的编译器遵循C++11标准,可使用关键字auto来简化迭代器声明:auto iPairFound = mapIntToString.find(key);multimap容器可能包含多个键相同的键...调用erase函数时将键作为参数,这将删除包含指定键的所有键-值对: mapObject.erase(key); erase函数的另一种版本接受迭代器作为参数,并删除迭代器指向的元素: mapObject.erase...这种内部使用一种容器但呈现另一种容器的行为特征的容器称为自适应容器。主要有三种类型:stack,queue,priority_queue。STL stack是一个模板类,要使用它,必须包含头文件。...首次调用非const函数时,COW指针通常为该非const函数操作的对象创建一个副本,而其他指针实例仍共享源对象。实现const和非const版本的运算符*'和->,是实现COW指针功能的关键。...使用stringstream进行字符串转化   C++中的stringstream类是最有用的工具之一,让您能够执行众多的转换操作。要包含头文件#include

    1.3K20

    三十分钟掌握STL

    例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。...2)           容器是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。...程序可能把迭代器作为一个变量创建。一个STL 容器类可能为了使用一个特定类型的数据而创建一个迭代器。作为指针,必须能够使用*操作符类获取数据。你还可以使用其他数学操作符如++。...容器迭代器 尽管C++指针也 是迭代器,但用的更多的是容器迭代器。容器迭代器用法和iterdemo.cpp一样,但和将迭代器申明为指针变量不同的是,你可以使用容器类方法来获取 迭代器对象。...由于使用迭代器需要关于STL容器类和算法的知识,在阅读了后面的两章后你可能需要重新复习一下本章内容。 输入迭代器 输入迭代器是最普通的类型。输入迭代器至少能够使用==和!

    2.1K80

    【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)

    内嵌类型迭代器基本都是在类里面typedef出来的,C++喜欢这样内嵌类型的定义方式。 迭代器的另一大特征就是像指针一样的东西,对于使用者来讲不必关心底层实现细节,将迭代器当作指针一样使用即可。...库的版本是不同的,前者调用PJ版本的STL库,后者调用SGI版本的STL库,SGI版本下vector的迭代器就是用原生指针实现的,但PJ版本下vector的迭代器并不是原生指针实现的,而是经过类(自定义类型...2.迭代器的价值是什么?(封装、类、对象的思想 && C++语法的不可替代性:引用、运算符重载等) 1. 即使我们没学过容器set,但我们依旧可以用迭代器来遍历set,打印容器set的所有元素。...每个容器的底层结构都形态各异,对于数组来说,迭代器就用原生指针来实现就可以完成迭代器的功能,你不用原生指针,用类去封装一下原生指针也可以,PJ版本就是这样实现的。...,实现迭代器的目的就是让所有底层数据结构都不同的容器在使用时,都能用一个 “指针” 来读写容器的所有数据,这个广义上的指针就是我们所说的迭代器,我们通过类和对象以及类封装的思想,让迭代器的行为达到像指针一样

    1.1K10

    C++基础 STL简介

    STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。 STL包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。...算法(Algorithms):各种常用**算法**,如Sort,Search,Copy,Erase,从实现的角度来看,STL算法是一种Function Templates。...迭代器(Iterators):扮演**容器与算法之间的胶合剂,是所谓的“泛型指针”**,共有五种类型,以及其它衍生变化,从实现的角度来看,迭代器是一种将:Operators*,Operator->,Operator...**所有STL容器都附带有自己专属的迭代器**,只有容器设计者才知道如何遍历自己的元素,原生指针(Native pointer)也是一种迭代器。...存取元素时,deque的内部结构会多一个间接过程,所以元素的存取和迭代器的动作会稍稍慢一些。 迭代器需要在不同区块间跳转,所以必须是特殊的智能型指针,非一般指针。

    68520

    三十分钟掌握STL

    例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。...2)           容器是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。...程序可能把迭代器作为一个变量创建。一个STL容器类可能为了使用一个特定类型的数据而创建一个迭代器。作为指针,必须能够使用*操作符类获取数据。你还可以使用其他数学操作符如++。...容器迭代器 尽管C++指针也是迭代器,但用的更多的是容器迭代器。容器迭代器用法和iterdemo.cpp一样,但和将迭代器申明为指针变量不同的是,你可以使用容器类方法来获取迭代器对象。...由于使用迭代器需要关于STL容器类和算法的知识,在阅读了后面的两章后你可能需要重新复习一下本章内容。 输入迭代器 输入迭代器是最普通的类型。输入迭代器至少能够使用==和!

    1.3K40

    C++一分钟之-标准模板库(STL)简介

    C++标准模板库(STL)是C++编程语言中的一组高度灵活且高效的通用算法和数据结构集合,它极大简化了常见编程任务,如容器管理、算法应用和迭代器使用。...迭代器(Iterator) 迭代器提供了一种统一的方式遍历容器中的元素,如同指针一样操作,但更为抽象和灵活。...算法(Algorithm) STL提供了丰富的算法,如排序(sort)、查找(find)、复制(copy)等,这些算法独立于容器,通过迭代器工作,增强了代码的通用性。...适配器(Adapter) 适配器允许你调整现有容器或迭代器的行为,如堆栈(stack)、队列(queue)基于其他容器实现,迭代器适配器则改变迭代行为。 常见问题与易错点 1....迭代器失效 问题:在容器大小变化的操作(如插入/删除元素)后继续使用迭代器。 避免:操作后重新获取迭代器,或使用指向容器的迭代器(如end())。 3.

    20610

    STL学习笔记(1)STL 概述

    容器:各种数据结构,如 vector、list、deque、set、map 等,用来存放数据,从实现角度来看,STL 容器是一种 class template。...迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将 operator* , operator-> , operator++,operator–等指针相关操作予以重载的 class...所有 STL 容器都附带有自己专属的迭代器,只有容 器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...STL 六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可 以协助算法完成不同的策略的变化,适配器可以修饰仿函数。...STL 具有高可重用性,高性能,高移植性,跨平台的优点。 高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库 来说提供了更好的代码重用机会。

    93130

    【笔记】C++标准库: 体系结构与内核分析(上)

    使用C11新增的区间循环配合auto让容器迭代写起来更方便: STL的容器可以分为三大类, 定义在同名头文件: 序列型容器: 数组或链表实现的列表, 数据组织紧凑 关联型容器: 红黑树实现的set和...STL有多种Traits, 对于迭代器使用的是iterator_traits. Traits是典型的偏特化模板类, 其经由偏特化来处理类类型的迭代器, 原生指针类型的迭代器和常量指针类型的迭代器....容器: vector vector的基础结构是双倍扩充的数组(实际扩充倍率依编译器决定, 有的编译器如的扩充倍率是1.5, 这个问题以后可能在另一篇文章一起细说), 通过如图的三个迭代器来进行尺寸控制...在早期实现中vector的迭代器只是一个原生指针, 但是后续实现给迭代器加入了状态机制, 将vector的迭代器正式扩展为一个类....容器: unordered unordered类是在C11的时候从hash类改名过来的, 这一组容器都使用散列表实现, C++中使用了如上图的非开放式散列表来处理.

    1.2K30

    开发成长之路(6)-- C++从入门到开发(C++知名库:STL入门·容器(一))

    为了建立数据结构与算法的一套标准,降低其间的耦合关系,以及提升各自的交互性、弹性、独立性,C++社群中诞生了STL. STL是一个开源项目,所以有很多个版本。...容器 各种数据结构,如Vector、List、Map,用于存放数据。 算法 各种常见算法如:排序、增删查等。从实现来看,STL算法属于泛型函数。...迭代器 很惊奇,迭代器不属于容器,也不属于算法。 扮演起容器与算法之间的“粘合剂”,是“泛型指针”。 原生指针可以作为一种迭代器,不过迭代器一般是以智能指针的形式存在的。...仿真函数 行为类似函数,从实现来看是一种重载了operator()的类或模板类。 函数指针可视为狭义上的仿真函数。...---- 来看一下STL六大组件联合工作的图示: ---- STL的序列式容器容器 源码之前,了无秘密 曾经面试官问过我这么一个问题:请你描述一下,STL中的所有容器,它们的底层实现机制、它们增删查改的时间复杂度是多少

    33810

    C++ STL编程轻松入门基础

    就拿C/C++中的指针而言,它的灵活与高效运用,使后来的STL在实现泛型化的同时更是保持了高效率。...迭代器(iterators)部分,STL的一个重要组成部分,如果没有迭代器的撮合,容器和算法便无法结合的如此完美。事实上,每个容器都有自己的迭代器,只有容器自己才知道如何访问自己的元素。...它有点像指针,算法通过迭代器来定位和操控容器中的元素。 数值(numerics)部分,包含了一些数学运算功能,提供了复数运算的支持。...在功能上保持了与原有iostream的兼容,并且增加了异常处理的机制,并支持国际化(internationalization)。 总体上,在C++标准函数库中,STL主要包含了容器、算法、迭代器。...(cout, "/n")); } 在这个程序里几乎每行代码都是和STL有关的(除了main和那对花括号,当然还有注释),并且它包含了STL中几乎所有的各大部件(容器 container,迭代器iterator

    1.6K91
    领券