c++ stl的迭代器部分功能可以这样实现

c++ map利用迭代器赋值 我自己的理解:c++的map类型的迭代器得到的是一个关于元素的引用,即pair,而且这个pair的关键字是const的,所以不能修改其值,我们只能修改value的值、 答案书的解释:解引用关联容器的迭代器,得到的是一个value_type的值得引用。因此对map而言,得到的是一个pair类型的引用,其first成员保存const关键字,second成员保存值。因此通过迭代器只能修改值,而不能修改关键字。 #include <string> #include <iostream> 阅读详情

前言

本文首先写了我理解的迭代器的部分功能,然后写如何实现这些功能,纯属是个人理解和实现,并不代表stl的迭代器就是那样实现的。本人还未阅读stl源码,不知道stl是如何实现的。为此特别说明,我不希望误导stl学习者。

我理解的c++ stl容器迭代器的部分功能

功能1:是对容器元素的指针

星号运算符

假设vector<int> list中某个元素list[2]的指针是point,迭代器器是iter。
我们可以这样使用指针:

int value=*point;
*point=3;    //这会导致list[2]=3;

我们可以像指针一样使用迭代器:

int value=*iter; 
*iter=3;     //这会导致list[2]=3;

->运算符

定义一个简单的类

class demo
{
	public:
	int v1;
	int v2;
}

假设vector<demo> list2的一个元素list2[2]是{1,2}。它的指针是point,它的迭代器是iter。
我们可以这样使用指针

int v1=point->v1;
point->v1=3;   //list2[2].v1=3;

我们可以以同样的方式使用迭代器

int v1-iter->v1;
point->v1=3;   //list2[2]=3;

功能1总结

我们可以把迭代器理解为指向某个元素的指针,然后可以像使用指针一样使用这个迭代器。

功能2:容器元素的成员的子集

树是节点的容器。节点是树的元素。节点有很多成员,有很多成员我们需要提供给用户,有些成员需要对用户屏蔽。通过迭代器就可以做到这点。用户从来不直接访问具体节点,他们最多只能获取节点对应的迭代器。迭代器里面有节点部分成员的引用。访问或者修改迭代器的成员,实际上就是访问和修改节点的成员。节点中要对用户屏蔽的成员,我们不要让他出现在迭代器成员里面即可。

功能3:容器元素的成员的访问权限

有时我们希望用户能够访问节点的部分信息,这部分信息中,又有一部分希望用户只能读不能写,一部分允许用户读和写。迭代器可以实现这样的功能。用户从来不能直接访问容器元素,他们只能访问容器元素的迭代器。我们在迭代器把只能读不能写的节点成员引用加上const。用户就不能修改了,但仍然可读。

功能4:容器的成员函数可以通过迭代器获取元素的地址,但用户不能

用户交给容器一个元素的迭代器,希望容器对这个元素做一些操作,由于迭代器里面是没有节点的全部信息的(迭代器是容器元素成员的子集),可能导致某些动作无法完成。幸运的是,容器可以通过迭代器获取它所指向的元素的地址。这个是个特殊权限。因为我们不希望用户可以这样做,不希望用户获取节点的全部信息。

对上面4个功能的实现

直接上代码,后面有对代码的解读和说明:

#include <iostream>

using namespace std;
class my_node;  //前部申明
class rb_tree;

class my_iterator
{
    public:
    const int &key;
    int &value;

    my_iterator(int& _key,int& _value):key(_key),value(_value)
    {
    }
    my_iterator* operator->()
    {
        return this;
    }
    int& operator*()
    {
        return value;
    }
    private:
    my_node *node;
    friend rb_tree;
};
class my_node
{
    public:
    int key;
    int value;
    my_node *left;
    my_node *right;
    my_iterator iter;
    my_node():iter(key,value){key=1;value=1;}
};


class rb_tree
{
public:
    void rb_delete(my_iterator iter)
    {
        my_node *node=iter->node; //通过迭代器获取迭代器对应的节点。只有容器的方法可以获取。其他地方获取容器方法是不行的。
    }
    

};

int main()
{
    my_node a;
    my_iterator aiter=a.iter;
    cout<<"通过迭代器获取节点的key:"<<aiter->key<<endl;
    //aiter.key=2;    //若取消注释,编译不通过,因为只能通过迭代器读key,不能修改key
    //my_node *ap=aiter->node;  //若取消注释,编译不通过,因为只有rb_tree的成员函数可以通过迭代器获取节点。
    cout<<"通过迭代器获取节点的value:"<<aiter->value<<endl;
    *aiter=2;//通过迭代器重载的*运算符修改节点的value值。
    cout<<"通过迭代器重载的*运算符修改节点的value值:"<<a.value<<endl;
    aiter->value=3;
    cout<<"通过迭代器修改节点的value值:"<<a.value<<endl;
}

前部申明

由于节点类中有一个迭代器成员,所以迭代器类必须在节点类前定义。又由于迭代器类中有一个节点类对象指针。所以必须在迭代器类前面对节点类做前部申明。前部申明之后,类申明之前,该类只能以指针或者引用的方式出现。

迭代器的类成员是节点类部分成员的引用

这样,主函数修改迭代器的类成员,实际上就是修改节点。
迭代器中的key前面加了const,使得用户只能读key,不能修改key。

由于把引用作为类成员,所以该类不能有缺省的构造函数,必须自己实现构造函数,并在初始化列表中,完成对引用类成员的初始化,而且,构造函数的参数也必须是引用类型。否则,编译会报错。

重载->运算符

为了使得迭代器能够像指针一样使用,重载了->运算符,这是一个单目运算符,返回指向对象本身的指针。

重载*运算符

这里返回的是节点 value字段的引用,使得迭代器像指向节点value字段的指针一样。

my_node指针private

节点迭代器与节点一一对应,体现在迭代器里面有一个node的指针。设置为private,使得用户不能通过迭代器对象获取节点指针。但又申明tree为友元。这样树(节点的容器)就可以访问迭代器的private成员,就可以过去迭代器对应的节点的指针了。

从Podfile到分享成功:ShareSDK小红书模块集成全流程实战(附视频分享代码) 本文详细介绍了iOS应用如何通过ShareSDK集成小红书分享功能的全流程,包括环境配置、SDK初始化、图片和视频分享实现,以及常见问题排查和性能优化策略。特别针对视频分享这一高频需求场景,提供了完整的代码示例和实战技巧,帮助开发者快速实现社交分享功能。 阅读详情

相关推荐

波分复用-Zblock仿真

Z-BLOCK是一种用于光通信模块的光学元件,其核心结构是在玻璃块一侧贴有4个特定波长滤光片,另一侧镀有反射膜和增透膜。光信号在内部呈现Z字形反射路径,实现波长分离。文章以可见光LED为例,在ZEMAX中演示了非序列模式下的建模过程,重点介绍了滤光片和膜层的参数设置方法。需要注意的是,入射角度需根据玻璃折射率、通道高度和厚度精确计算,否则可能导致光泄漏。该建模方法同样适用于光通信中的光纤激光器系统。

Zhaxibamao的博客 1743

C++ :迭代器的引入

移动遍历的机制数组遍历元素,指针*p++思考结构体怎么使用指针遍历元素?

qq_43441284的博客 1984

高德地图 搜索和点击定位

高德地图vue

weixin_45474673的博客 1943

迭代器解释(C++)

迭代器解释(C++)

m0_61990249的博客 1733

QT绘制饼图+柱状图+折线图

使用qt绘制,折线图,饼图,柱状图,多柱状图

梅山 3877

计算机视觉教程1-1:透视空间与透视变换

在生活中,透视现象很常见,其物理本质是光的直线传播。由于人眼与相机在捕获图像时均存在透视现象,因此计算机几何基于透视空间进行研究。本节介绍透视变换原理

FRIGIDWINTER的博客 3090

通过迭代器it来访问vector里的元素。

#include<stdio.h> #include<vector> using namespace std; int main(){ vector<int> vi; //整形vector容器 for(int i = 1;i <= 5; i++){ vi.push_back(i); //在vi的末尾依次添加1,2,3,4,5 } vector<int>::iterator it = vi.begin(); /.

CJSYYDY的博客 2183

桌面运维工程师面试题汇总(高频完整版)

岗位,覆盖:电脑硬件、系统安装与故障、网络、办公软件、安全、AD域、打印机、日常排错、服务意识。

老韩的Linux云计算架构师进阶之路 909

【C++】STL——list(部分功能模拟实现、迭代器、反向迭代器)

STL中的list底层实现是用带头循环的双链表,这种结构设计巧妙的使得list能够在随机位置插入删除的效率搞,但处理不了大量数据,相比于vector,vector的随机位置删除的速度就低于list ,因为vector需要挪动数据,而list直接把链子相接就可以了那么list在使用的时候不难,stl的容器相似性很强,所以这次list的实现能更让我们学会c++关于封装的理解,c++类和对象的巩固,通过各种模板的类型,迭代器的封装,反向迭代器的封装使用。

小胡同学的博客 418

QMK键盘固件开发零基础教程(2025全新重制版)

《QMK键盘固件开发零基础教程(2025全新重制版)》是一套专为键盘爱好者和开发者设计的全面教程,旨在帮助用户从零基础快速掌握最新的QMK固件开发技术。教程基于2025年最新的QMK版本(0.19.8+),解决了旧版教程中的诸多问题,如概念不清、步骤缺失和代码过时等。新版教程提供了详细的图解、完整的项目源码以及从环境配置到高级功能开发的全流程指导。此外,教程还涵盖了2024年QMK生态的重大变革,包括键码系统的重构、编译工具链的更新以及Config文件格式的改变等。付费版教程额外提供独家内容,如新特性解析、

Despacito0o的博客 1119

ArtMate —— 美术公开课智能体开发全记录

本文档详细描述了一款专为中小学美术公开课设计的智能教学助手的开发过程。该智能体融合了多模态感知、自然语言交互、风格迁移与智能评价等技术,旨在辅助教师开展生动、高效的美术鉴赏与创作课程。全文包含需求分析、系统架构设计、核心模块代码实现、交互界面搭建及完整运行示例,并配有详尽的行内注释和设计思想阐述,为教育技术开发者提供一份可落地、可扩展的参考方案。

huanghm88的专栏 152

【C++】STL——vector (vector 的使用、部分功能模拟实现、深拷贝、迭代器失效)

vector是STL的容器之一,他是一个类似顺序表的这么一个结构,能够进行插入删除、随机访问,一般像数组那样使用。在学vector 的过程中,遇到了关于深拷贝的问题,通过实现vector 能够更深层次的认识到这个容器的特性。

小胡同学的博客 657

PX4实战(十):PX4导航模块(Navigator)详解

本文将对 PX4 固件 v1.14.3 版本中的 Navigator(导航)模块进行详尽的技术剖析。作为飞行控制栈中的高层决策核心,Navigator 模块承担着将抽象的任务指令转化为具象的底层控制设定点的关键职责。本文基于对 src/modules/navigator 目录下源代码的深究研究与架构反推,详细阐述了该模块的文件组织结构、基于状态机的控制逻辑、uORB 异步通讯机制、核心任务模式(Mission)与返航模式(RTL)的实现细节,以及地理围栏(Geofence)与任务可行性检查(Feasibil

PX4-SLAM-PNC 668

【C++_STL】list用法&底层实现

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与非常相似:最主要的不同在于是单链表,只能朝前迭代,已让其更简单高效。4.与其他的序列式容器相比(arrayvectordeque)list通常在任意位置进行插入、移除元素的执行效率更好。5.与其他序列式容器相比,list和。

菜菜成长为后端开发大佬 1166

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++STL——容器-string(含模拟实现,即底层原理)全博客最细,万字巨作!

目录1.什么是STL?2.容器——stringMember functions(成员函数)1.constructor(构造)2. Iterators(迭代器)1.begin2.end3.rbegin4.rend3. Capacity(容量管理)1.size2.length3.max_size4.capcity5.resize​编辑6.reserve7.clear​编辑8.empty​编辑4.Element Access(元素访问)2.at5.Modifiers(修改器)​编辑2.append。

2402_86667364的博客 1753

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ - STL

标准模板库(Standard Template Library,简称STL),就是一些常用数据结构和算法的模板的集合。 广义上讲,STL分为3类:Algorithm(算法)、Container(容器)和Iterator(迭代器),容器和算法通过迭代器可以进行无缝地连接。 详细的说,STL由6部分组成:容器(Container)、算法(Algorithm)、 迭代器(Iterator)、仿函数(Function object)、适配器(Adaptor)、空间配制器(Allocator)。容器(Co

qq_44736340的博客 287

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

STL实现原理及其实现

STL(Standard Template Library,标准模板库)是C++标准库的一部分,它提供了一套通用的、高效的算法和数据结构。STL的设计目标是将数据结构(容器)和算法分离,使得它们可以独立地进行优化。

weixin_45422672的博客 525

C++STL

STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。moreSTL 最初由惠普实验室开发,于 1998 年被定为国际标准,正式成为 C++ 标准库的重要组成部分。如今 STL 已完全被内置到支持 C++ 的编译器中,无需额外安装。STL 就位于各个 C++ 的头文件中,即它并非以二进制代码的形式提供,而是以源代码的形式提供。

crossoverpptx的博客 197

C++ 泛型程序设计——迭代器

编写不依赖于具体数据类型的程序 将算法从特定的数据节结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型。 对于两个不同的概念A和B,如果概念A所需求得功能也是概念B所需求的功能,那么就说概念B也是概念A的子概念。 术语:模型 符合一个概念的数据类型称为该概念的模型。 用概念做模板参数名: 很多STL的实现代码就是使用概念来...

yh的博客 408

C++:STL标准入门汇总

C++:STL标准入门汇总 学无止境!!! 第一部分:(参考百度百科)  一、STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来 的。现在虽说它主要出现在C++中,但在被引入C++之前该技术

wisdom605768292的专栏 643

转换为list_C++ STL std::list部分实现

写在前面(本文是个人笔记,有胡言乱语和少数错漏部分)这篇笔记图解了STL中std::list的实现,并结合代码分析了其迭代器,结点定义,部分成员函数的实现。最后,仿造std::list的代码,在Leetcode 146. LRU缓存机制中实现了list的部分功能。总结list的几个要点:list仅持有一个指针p(即 _M_node),指向哨兵节点。p作为end()的返回值。p->next是头...

weixin_39531761的博客 550

什么是STL

STL  一、STL简介  STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。  STL的代码从广义上讲分为三类:a

王以山的专栏 1192

STL 编程

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容

mfreesky的专栏 1228

STL1(C++标准模板库)

在C++标准库中,STL被组织为下面的13个头文件几乎STL提供的所有算法都是通过迭代器存取元素进行工作的,它允许我们重复利用已有的实现构造直接特定类型下的数据结构,通过设置一些模板,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型。...

weixin_46120107的博客 1512

C++ STL 一般总结

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。

QtCompany的博客 200

2-1 C++ 中的STL 简介

本文源自于 C 语言中文网: 前面介绍了 函数模板 和 类模板 两个概念, C++ 对模板(Template)支持得很好,整个STL(Standard Template Library) 提供了通用的模板类和模板函数; 这些模板类和模板函数就是使用模板把常用的数据结构(如向量、链表、队列、栈)及其算法都实现了一遍,并且做到了数据结构和算法的分离。 自 1998 年 ANSI/ISO C++ 标准正式定案,C++ STL 规范版本正式通过以后,由于各个 C++ 编译器厂商, 在开源版本的基础上,实现了.

chumingqian的博客 235
上一篇: char指针和unsigned char指针间的转换
下一篇: 解决pyinstaller打包过大的问题
?-ldl
博客等级 码龄7年 712粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值