map和set的封装学习笔记

在学习了红黑树、map和set的使用后,来看看map和set的是如何将这颗树封装起来的。

理解图

这里的封装相比前面学习的容器更为复杂,所以画了伪代码图来理解,附带说明

具体实现代码可以参考

map和set的封装

一些细节

当然在实现上仍有很多细节需要注意,同时以往很多语法知识都忘记了,特别是关于const修饰(在实现const迭代器的时候踩了很多坑才发现的),所以在这里总结一下

为什么用于提取键的类需要在Tree中实例化?

模板参数中的keyofvalue本质是一个类类型,仿函数本质是这个类的成员函数,而非静态成员函数一定会带有this指针,而除了静态成员函数和不调用内存的成员函数不依赖this指针,其它所有成员函数都要求类先实例化,**才能确定this指针,**从而对成员进行访问。

为什么被const迭修饰的begin/end必须对this指针进行const修饰才能用?

调用const begin的可以是普通map对象,也可以是const map对象,而const对象只能看到带被constconst后缀的函数 (防止修改this指针所指向的对象),所以为了让const对象看到并使用,必须 提供一个带const 后缀的begin函数

为什么迭代器后置++返回值不能带引用?

因为在函数内部创建的temp是一个临时变量,肯定不能用引用接受的,而是要创建副本返回

既然前面提到const对象只能看到带被constconst后缀的函数,为什么还要强调类里面的函数参数如果可以尽量使用const修饰呢?

有如下三点原因:

1.为了接纳临时对象和常量,例如string str="dadadad";传进去右值,不能用左值来接收

2.防止修改传进来的参数本身

3.即便参数本身是否被修改不重要,并不代表它可以肆意修改传入的参数,比如在函数内部不小心修改了参数,又赋值给成员变量,而原本预计的就是要把参数原封不动地套用

区分const iterator和const_iterator,const iterator

const iterator导致iterator中的成员node*被const修饰 ,也就是变成了node* const node_ ,此时无法对_node这个指针进行修改(如不能++--)但可以修改其中指向的值 。而const_iterator接收了const T* 这个模板参数,这种写法本身就是不能对T指针指向的内容进行修改 ,迭代器内部可能修改所指向内容的函数只有解引用相关的函数 (->和*),而此时它们的返回值是const T&和const T*,所以能够保证迭代器指向的对象内容不被修改。

const 对象的上下文中,编译器会把所有成员变量视为 const 类型。任何试图修改它们的代码(哪怕是在类的内部函数里),都会直接报编译错误

template<class const T> 是非法语法,classtypename 后面只能跟标识符,所以只有在定义类的时候选择是否传const类型

另外一些心得:

map和set我在实现之前其实没使用明白,所以对功能的理解错误,导致实现时存在有很多误区,特别是插入函数对返回值的要求。应当先理解需求,再实现。

画图可以理清思路,后面工程代码量的不断增加,封装不断变得复杂,可能仍要用画图来理解

相关推荐
Logic10135 分钟前
C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间
c语言·数据结构·动态规划·贪心·时间复杂度·算法题·最大子数组和
鹿角片ljp1 小时前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法
.YM.Z1 小时前
C++——【继承】的底层逻辑与【多态】实现机制
c++·多态·继承
汉克老师1 小时前
GESP2026年9月认证C++三级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出数据表中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
小小龙学IT3 小时前
Qt QPainter 2D 绘图系统深度解析:从画笔到渲染引擎适
c++·qt
wabs6663 小时前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法
小小龙学IT3 小时前
Boost.PFR 开源结构体字段反射库深度解析
c++·开源
程序猿编码3 小时前
零依赖纯手写:C++ 实现完整神经网络,张量反向传播全打通
c++·神经网络·transformer·大模型推理
码匠许师傅3 小时前
【C++三方组件】utfcpp:UTF-8 字符串处理避坑
c++