从二叉树到 STL:揭开 set 容器的本质与用法

从二叉树到 STL:揭开 set 容器的本质与用法

前言:

        上次介绍完二叉搜索树后,更新中断了一段时间,先向大家致歉。最近学习状态有些起伏,但我正在努力调整,相信很快会恢复节奏。今天我们继续深入探讨——关联容器,它在算法和工程中都非常常见和重要。

1.之前的遗漏

        我之前写的二叉搜索树其实没有写完,我仅仅写了一个节点只能存储一个值的二叉搜索树。在我们日常的工作中,这种树的使用率其实还是比较低的。最受欢迎的是里面存储两个值的二叉搜索树,这个可以类比Python中的字典。相信学过python的读者对此不陌生,字典其实存放了一对值,分别是Key和Value,类比英文字典中的英语和汉字,我们通过英文(Key)来找到对应的中文(Value)。这其实才是我们常使用到的二叉搜索树,下面我通过举例来帮助各位理解这两棵树的区别。

1.1.Key搜索场景

        举个例子,现在很多小区配有地下停车库。业主的车牌号会录入系统中,车辆进入时由系统识别并判断是否允许进入。这就是典型的 Key 搜索场景 —— 只需根据一个关键字(车牌号)进行查找。

1.2.Key/Value搜索场景

        还是以我们的生活举例,如今我们进入各大商场的时候,如果开车的话难免会需要停进商场专用的停车场,此时这就是停车场计费系统,我们需要录入两个值:车子的车牌号以及入场时间,记录好之后,当车辆想要离开停车场的时候,就会通过车牌(Key)来进行系统中管理的车辆信息进行检索,检索成功后会根据当前的时间减去入场的时间计算出车辆在停车场呆过的时间,从而计算出需要交付的金额。这边是Key/Value的搜索场景,Key其实不是关键,其中的Value才是关键,Key更像是一个标识符,我们通过这个符号来进行真正数据的获取。所以可以看出,它在我们日常的生活中使用的频率更大。

1.3.Key/Value类型的二叉搜索树的源码

        由于难度不大,小编就不讲其中的细节了,其实它和上篇我们讲述的Key类型的二叉搜索数一样,只不过多了一个Value而已。

#include<iostream> #include<vector> ​ using namespace std; template<class K, class V> struct BSTNode { // pair<K, V> _kv; K _key; V _value; BSTNode<K, V>* _left; BSTNode<K, V>* _right; BSTNode(const K& key, const V& value)       :_key(key)       , _value(value)       , _left(nullptr)       , _right(nullptr)   {} }; template<class K, class V> class BSTree {    typedef BSTNode<K, V> Node; public:    BSTree() = default;    BSTree(const BSTree<K, V>& t)   {        _root = Copy(t._root);   }    BSTree<K, V>& operator=(BSTree<K, V> t)   {        swap(_root, t._root);        return *this;   }    ~BSTree()   {        Destroy(_root);        _root = nullptr;   }    bool Insert(const K& key, const V& value)   {        if (_root == nullptr)       {            _root = new Node(key, value);            return true;       }        Node* parent = nullptr;        Node* cur = _root;        while (cur)       {            if (cur->_key < key)           {                parent = cur;                cur = cur->_right;           }            else if (cur->_key > key)           {                parent = cur;                cur = cur->_left;           }            else           {                return false;           }       }        cur = new Node(key, value);        if (parent->_key < key)       {            parent->_right = cur;       }        else       {            parent->_left = cur;       }        return true;   }    Node* Find(const K& key)   {        Node* cur = _root;        while (cur)       {            if (cur->_key < key)           {                cur = cur->_right;           }            else if (cur->_key > key)           {                cur = cur->_left;           }            else           {                return cur;           }       }        return nullptr;   }    bool Erase(const K& key)   {        Node* parent = nullptr;        

Read more

【算法】连通块问题(C/C++)

【算法】连通块问题(C/C++)

目录 连通块问题 解决思路 步骤: 初始化: DFS函数: 复杂度分析  代码实现(C++) 题目链接:2060. 奶牛选美 - AcWing题库 解题思路: AC代码:  题目链接:687. 扫雷 - AcWing题库  解题思路: AC代码: 总结: 连通块问题 连通块问题(Connected Component Problem)是一个经典的图论问题,通常用来找出图中的所有连通分量。给定一个无向图,连通块问题的目标是确定图中有多少个连通分量(即有多少个互相连通的节点组成的集合) 解决思路 1. 深度优先搜索(DFS) 或 广度优先搜索(BFS): * 可以从任意未访问的节点出发,进行DFS或BFS,标记所有能够访问到的节点,代表这个连通分量。 * 重复这个过程,直到所有节点都被访问为止。每次从新的未访问节点出发时,就代表发现了一个新的连通分量。 2.

By Ne0inhk
【C++:继承】C++面向对象继承全面解析:派生类构造、多继承、菱形虚拟继承与设计模式实践

【C++:继承】C++面向对象继承全面解析:派生类构造、多继承、菱形虚拟继承与设计模式实践

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的C++专栏简介: 目录 C++的两个参考文档 4  ~>  派生类的默认成员函数专题 4.4  实现一个不可继承类实现 4.4.1  间接实现:【C++98】构造函数私有的类不能被继承 4.4.2  直接实现:final关键字修改基类 4.4.3  代码实现 4.4.4  final关键字

By Ne0inhk
c++之inline关键字从基础到通天(一篇即毕业系列)

c++之inline关键字从基础到通天(一篇即毕业系列)

文章目录 * inline 是一个请求(而非命令) * inline 函数通常用于小函数 * inline 函数的定义通常放在头文件中 * inline 函数不能包含复杂的控制结构 * 编译器可能忽略 inline 请求 * 验证是否 inline * 代码块 * 汇编代码分析 * 其他验证方法 * 推荐阅读 欢迎收看一篇即毕业系列,本系列的其它内容如同本篇一样优秀喔!! 那么话不多说! 关于 inline,我们直接了解以下几个知识点即可。 inline 是一个请求(而非命令) inline 关键字用于向编译器发出一个请求,建议将函数体在每个调用点内联展开。这意味着编译器在编译过程中,可能会将函数的代码直接插入到调用该函数的地方,而不是通过通常的函数调用机制来执行。 需要注意的是,inline 只是一个建议,编译器可以选择是否接受这个建议。编译器可能会基于多种因素(如函数的大小、复杂性、调用频率以及整体代码的优化目标)来决定是否进行内联展开。 inline 函数通常用于小函数 inline 函数通常用于那些执行速度快且调用频繁的小

By Ne0inhk
C++ 模板进阶:特化、萃取与可变参数模板

C++ 模板进阶:特化、萃取与可变参数模板

C++ 模板进阶:特化、萃取与可变参数模板 💡 学习目标:掌握模板进阶技术的核心用法,理解模板特化的深层应用、类型萃取的实现原理,以及可变参数模板的灵活使用,提升泛型编程的实战能力。 💡 学习重点:模板特化的进阶场景、类型萃取工具的设计与应用、可变参数模板的展开技巧、折叠表达式的使用方法。 一、模板特化进阶:处理复杂类型场景 💡 模板特化不只是针对单一类型的定制,还能处理指针、引用、数组等复杂类型,实现更精细的类型适配逻辑。 1.1 指针类型的模板特化 通用模板默认处理普通类型,我们可以为指针类型单独编写特化版本,实现指针专属的逻辑。 #include<iostream>#include<string>usingnamespace std;// 通用模板:处理普通类型template<typenameT>classTypeProcessor{public:staticvoidprocess(T data){ cout

By Ne0inhk