map和set(一)

    首先模拟一下key形式类 使用的结构是搜索二叉树  结点中有左孩子和右孩子  还有一个存储的值

	template <class K>struct BSTnode//搜索二叉树不支持修改  中序遍历是有序的{K _key;BSTnode<K>* _left;BSTnode<K>* _right;BSTnode(const K& key):_key(key), _left(nullptr), _right(nullptr){}};

这里二叉树代码在之前有更详细的 也有测试代码 就不去复制了  

主要功能有四个  删除 插入 遍历  查找  

 

     模拟一下key/value形式类  使用的结构是搜索二叉树   每一个节点中有左孩子和右孩子 还有一个key 和一个value  当我们找到可以key之后 也就找到了对应的value

template <class K, class V>
struct BSTnode//搜索二叉树不支持修改  中序遍历是有序的
{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){}
};

之后二叉树的功能有插入 删除  查找 遍历   这其中只有insert 需要修改  既要插入value 也要插入key  但对于删除 查找 遍历 只要有key就可以完成 所以就不需要改变

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;
}

这里通过一段string类型的进行测试

int main()
{keyvalue::BSTree <string, string> tt;tt.insert("left","左边");tt.insert("right", "右边");tt.insert("insert", "插入");tt.insert("string", "字符串");string str;while (cin >> str){auto ret = tt.find(str);if (ret){cout << "->" << ret->_value << endl;}else{cout << "无此单词 请重新输入" << endl;}}//tt.insert();return 0;
}

通过查找key 就可以确定对应的存储value内容  非常方便   这里最后使用的是ctrl+z来结束程序执行

  这里使用到了 operator>>(string)这个函数的返回值istream 会被operator bool 转换成bool值来进行判断是否结束程序  而当我们输入ctrl+z  就会转换成bool值false 这样就会结束程序

    首先模拟一下key形式类 使用的结构是搜索二叉树  结点中有左孩子和右孩子  还有一个存储的值

	template <class K>struct BSTnode//搜索二叉树不支持修改  中序遍历是有序的{K _key;BSTnode<K>* _left;BSTnode<K>* _right;BSTnode(const K& key):_key(key), _left(nullptr), _right(nullptr){}};

这里二叉树代码在之前有更详细的 也有测试代码 就不去复制了  

主要功能有四个  删除 插入 遍历  查找  

     模拟一下key/value形式类  使用的结构是搜索二叉树   每一个节点中有左孩子和右孩子 还有一个key 和一个value  当我们找到可以key之后 也就找到了对应的value

template <class K, class V>
struct BSTnode//搜索二叉树不支持修改  中序遍历是有序的
{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){}
};

之后二叉树的功能有插入 删除  查找 遍历   这其中只有insert 需要修改  既要插入value 也要插入key  但对于删除 查找 遍历 只要有key就可以完成 所以就不需要改变

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;
}

这里通过一段string类型的进行测试

int main()
{keyvalue::BSTree <string, string> tt;tt.insert("left","左边");tt.insert("right", "右边");tt.insert("insert", "插入");tt.insert("string", "字符串");string str;while (cin >> str){auto ret = tt.find(str);if (ret){cout << "->" << ret->_value << endl;}else{cout << "无此单词 请重新输入" << endl;}}//tt.insert();return 0;
}

通过查找key 就可以确定对应的存储value内容  非常方便   这里最后使用的是ctrl+z来结束程序执行

  这里使用到了 operator>>(string)这个函数的返回值istream 会被operator bool 转换成bool值来进行判断是否结束程序  而当我们输入ctrl+z  就会转换成bool值false 这样就会结束程序

这里的key/value除了可以运用在字典序中 还可以运用在计数上

int main()
{// 统计水果出现的次数string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };keyvalue::BSTree<string, int> countTree;for (const auto& str : arr){// 先查找水果在不在搜索树中// 1、不在,说明水果第一次出现,则插入<水果, 1>// 2、在,则查找到的节点中水果对应的次数++//BSTreeNode<string, int>* ret = countTree.Find(str);auto ret = countTree.find(str);if (ret == NULL){countTree.insert(str, 1);}else{ret->_value++;}}countTree.inorder();return 0;
}

 接下来我们写一下二叉树的析构

    ~BSTree()
{destroy(_root);_root = nullptr;
}void destroy(node*root){if (root == nullptr)return;destroy(root->_left);destroy(root->_right);delete root;}

这里需要用到destroy函数这是因为析构函数是没有参数的 而二叉树的析构有需要用到参数 所以嵌套了一个destroy函数  这里使用的是递归  先销毁左边  在销毁右节点  最后销毁跟节点

接下来写一下 拷贝构造 

由于我们现在没有写拷贝构造 使用的是浅拷贝 会出问题

int main()
{keyvalue::BSTree <string, string> tt;tt.insert("left","左边");tt.insert("right", "右边");tt.insert("insert", "插入");tt.insert("string", "字符串");keyvalue::BSTree<string, string> t(tt);return 0;
}

这时代码是会崩溃的

BSTree(const BSTree<K,V>& t)
{_root = copy(t._root);
}	
node* copy(node* root){if (root == nullptr){return 0;}node* newroot = new node(root->_key, root->_value);newroot->_left = copy(root->_left);newroot->_right = copy(root->_right);return newroot;}

 这里同样需要传参  所以进行了嵌套copy函数  这里如果二叉树为空就返回  如果不为空 开始拷贝  从根节点开始首先赋值 之后链接对应左右孩子 这里左右孩子的拷贝通过递归完成

写完成之后运行会出问题

这是因为没有默认构造函数 这里我们写一个比较快捷的方式

	BSTree() = default;

 

这样拷贝构造就可以正常运行了

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/446080.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

adum1201数字隔离器中文资料与应用

ADuM1201是ADI公司推出的一款数字隔离器&#xff0c;其典型应用有工业自动化、通讯电源管理、医疗设备以及汽车等领域。本文将对ADuM1201数字隔离器进行详细的介绍和应用分析&#xff0c;以帮助读者更好地了解和使用该产品。 一、ADuM1201数字隔离器概述 1、基本参数 ADuM120…

卷积神经网络细节问题及知识点

一、Batch Normalization Batch Normalization&#xff08;BN&#xff0c;批归一化&#xff09; 是深度学习中的一种技术&#xff0c;主要用于加速神经网络的训练过程&#xff0c;同时提高网络的稳定性和收敛速度。它通过对每一层的输出进行归一化&#xff0c;减少梯度消失和梯…

Ubuntu安装Mysql并实现远程登录【ubuntu 24.04/mysql 8.0.39】

一、安装MySQL sudo apt update # 更新软件源 sudo apt install mysql-server -y # 安装 mysql --version # 查看版本 sudo systemctl status mysql # 查看运行状态 netstat -tln # 以数字ip形式显示mysql的tcp监听状态二、设置MySQL的root密码 sudo mysql -u root # 使…

第二十三篇:网络拥塞了,TCP/IP如何解决的?

一.显示拥塞通知 当发生网络拥塞时&#xff0c;发送主机应该减少数据包的发送量。作为IP上层协议&#xff0c;TCP虽然也能控制网络拥塞&#xff0c;不过它是通过数据包的实际损坏情况来判断是否发生拥塞。然而这种方法不能在数据包损坏之前减少数据包的发送量。 为了解决这个…

pytorch与卷积神经网络实战笔记

课程视频链接 CNN卷积神经网络算法原理 全神经网络的整体结构 输入层&#xff08;x1, x2, x3…&#xff09;->隐藏层&#xff08;全连接&#xff09;->输出层&#xff0c;整体就类似于一个函数&#xff0c;输入x&#xff0c;经过函数module(x)得到输出y的过程&#xf…

笔试算法总结

文章目录 题目1题目2题目3题目4 题目1 使用 StringBuilder 模拟栈的行为&#xff0c;通过判断相邻2个字符是否相同&#xff0c;如果相同就进行删除 public class Main {public static String fun(String s) {if (s null || s.length() < 1) return s;StringBuilder builde…

闲谈Promise

预备知识 回调函数&#xff1a;当一个函数作为参数传入另一个函数中&#xff0c;并且它不会立刻执行&#xff0c;当满足一定条件之后&#xff0c;才会执行&#xff0c;这种函数称为回调函数。比如&#xff1a;定时器。异步任务&#xff1a;与之对应的概念是同步任务&#xff0…

【Axure原型分享】标签管理列表

今天和大家分享通过标签管理列表的原型模板&#xff0c;包括增删改查搜索筛选排序分页翻页等效果&#xff0c;这个模板是用中继器制作的&#xff0c;所以使用也很方便&#xff0c;初始数据我们只要在中继器表格里填写即可&#xff0c;具体效果可以观看下方视频或者打开预览地址…

Cesium.js(SuperMap iClient3D for Cesium)进行三维场景展示和图层动画

1&#xff09;&#xff1a;参考API文档&#xff1a;SuperMap iClient3D for Cesium 开发指南 2&#xff09;&#xff1a;官网示例&#xff1a;support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#layer 3&#xff09;&#xff1a;SuperMap iServer&…

电鳗带来灵感,防潮电源诞生,全打印技术的魅力

大家好&#xff01;今天来了解一项受电鳗启发的防潮完全可打印电源的研究——《A moisture-enabled fully printable power source inspired by electric eels》发表于《PNAS》。随着可穿戴电子设备的发展&#xff0c;对安全、一次性且具成本效益的电源需求大增。传统电池存在不…

LibreOffice SDK是LibreOffice软件的开发工具包

LibreOffice SDK是LibreOffice软件的开发工具包&#xff0c;它提供了一系列工具和库&#xff0c;使得开发者可以基于LibreOffice进行扩展或开发新的应用程序。以下是对LibreOffice SDK的详细介绍&#xff1a; 一、下载与安装 下载地址&#xff1a; 可以在LibreOffice的官方网站…

利用 Llama 3.1模型 + Dify开源LLM应用开发平台,在你的Windows环境中搭建一套AI工作流

文章目录 1. 什么是Ollama&#xff1f;2. 什么是Dify&#xff1f;3. 下载Ollama4. 安装Ollama5. Ollama Model library模型库6. 本地部署Llama 3.1模型7. 安装Docker Desktop8. 使用Docker-Compose部署Dify9. 注册Dify账号10. 集成本地部署的 Llama 3.1模型11. 集成智谱AI大模型…

RUM性能优化之图片加载

作者&#xff1a;三石 在现代Web开发中&#xff0c;图片作为内容表达的核心元素&#xff0c;其加载效率直接影响到页面的整体性能和用户体验。随着高清大图和动态图像的普及&#xff0c;优化图片加载变得尤为重要。RUM作为一种主动监测技术&#xff0c;能够帮助开发者从真实用户…

【CubeMLP】核心方法解读

abstract&#xff1a; 多模态情绪分析和抑郁估计是利用多模态数据预测人类心理状态的两个重要研究课题。以前的研究主要集中在开发有效的融合策略&#xff0c;以交换和整合来自不同模式的心智相关信息。一些基于mlp的技术最近在各种计算机视觉任务中取得了相当大的成功。受此启…

如何解决 Vim 中的 “E212: Can‘t open file for writing“ 错误:从编辑到权限管理(sudo)

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

C语言 | Leetcode C语言题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; char * validIPAddress(char * queryIP) {int len strlen(queryIP);if (strchr(queryIP, .)) {// IPv4int last -1;for (int i 0; i < 4; i) {int cur -1;if (i 3) {cur len;} else {char * p strchr(queryIP last 1, .);if (p…

在Leaflet中使用divIcon进行自定义标绘实战

前言 之前在一些地理信息和旅游博主的信息介绍中&#xff0c;对于一些景点的信息时空分布。总是被他们的地图制作所深深吸引。与常规的地图文字标绘不同的是&#xff0c;在传统的地图标绘中&#xff0c;我们习惯于将文字信息直接标注到对应的位置点旁边。当然&#xff0c;这样其…

电脑快速切换IP地址命令是什么?详解与实践

有时&#xff0c;出于安全考虑或测试需要&#xff0c;我们可能需要快速切换电脑的IP地址。虽然这一过程在初学者看来可能略显复杂&#xff0c;但通过简单的命令和步骤&#xff0c; 即使是普通用户也能轻松实现。本文将详细介绍在Windows系统中快速切换IP地址的几种方法&#xf…

基于Jenkins+K8S构建DevOps自动化运维管理平台

目录 1.k8s助力DevOps在企业落地实践 1.1 传统方式部署项目为什么发布慢&#xff0c;效率低&#xff1f; 1.2 上线一个功能&#xff0c;有多少时间被浪费了&#xff1f; 1.3 如何解决发布慢&#xff0c;效率低的问题呢&#xff1f; 1.5 什么是DevOps&#xff1f; 1.5.1 敏…

潜水打捞系统助力,破解汽车打捞难题

随着人类活动的不断扩展&#xff0c;汽车落水事故频发&#xff0c;成为救援工作中的一大难题。汽车因其重量和结构特性&#xff0c;一旦沉入水体&#xff0c;打捞工作将面临巨大挑战。传统的打捞方法往往效率低下&#xff0c;且在操作过程中可能会对汽车造成进一步的损害&#…