C++------map和set的使用

文章目录

  • 关联式容器
  • 键值对
  • 树型结构的关联式容器
    • set的介绍
    • map的介绍

关联式容器

什么是关联式容器?它与序列式容器有什么区别?

关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key,value>结构的键值对,在数据检索时比序列式容器效率更高。这里的序列是容器是指:vector,list、deque的底层。

键值对

键值对我们可以把它理解为英语单词对应中文意义的一种映射关系。该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的value也就是英语单词的中文意思。

template<class T1,class T2>
struct pair
{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair():first(T1()),second(T2()){}pair(const T1& a, const T2& b):first(a),second(b){}
};

树型结构的关联式容器

根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列,平衡二叉搜索树中序遍历可以得到一个有序的序列。

set的介绍

  • 与map/multimap不同,map/multimap中存储的是真正的键值对<key,value>,set中只存放value,但在底层实际存放的是由<value,value>构成的键值对。

  • set中插入元素时,只需要插入value即可,不需要构造键值对。

  • set中的元素不可以重复(因此可以使用set进行去重)。

  • 使用set的迭代器遍历set中的元素,可以得到有序序列

  • set中的元素默认按照小于来比较

  • set中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n

  • set中的元素不允许修改

  • set中的底层使用二叉搜索树(红黑树)来实现
    在这里插入图片描述
    T: set中存放元素的类型,实际在底层存储<value, value>的键值对。
    Compare:set中元素默认按照小于来比较
    Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理

使用set的一些代码

int main()
{set<int> myset;for (int i = 1; i < 10; i++){myset.insert(i*10);}set<int>::iterator itlow, itup;//取相邻的数字itlow = myset.lower_bound(35); // >=35itup =myset.upper_bound(60); //> 60cout << *itlow << endl;cout << *itup << endl;myset.erase(itlow, itup);for (auto& e : myset){cout << e << endl;}return 0;
}int main()
{set<int> myset;//set是去重的,这里的代码没有意义,要在multiset里面使用myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);for (int i = 1; i < 10; i++){myset.insert(i*10);}auto ret = myset.equal_range(10);set<int>::iterator itlow, itup;itlow = ret.first;itup = ret.second;cout << *itlow << endl;cout << *itup << endl;return 0;
}void test_set()
{multiset<int> myset;set是去重的,这里的代码没有意义,要在multiset里面使用myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);for (int i = 1; i < 10; i++){myset.insert(i * 10);}auto ret = myset.equal_range(10);multiset<int>::iterator itlow, itup;itlow = ret.first;itup = ret.second;cout << *itlow << endl;cout << *itup << endl;for (auto e : myset){cout << e << " ";}cout << endl;myset.erase(itlow, itup);for (auto e : myset){cout << e << " ";}
}

map的介绍

  1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元
    素。
  2. 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的 内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型
    value_type绑定在一起,为其取别名称为pair: typedef pair<const key, T> value_type;
  3. 在内部,map中的元素总是按照键值key进行比较排序的。
  4. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序 对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
  5. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
  6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。
    在这里插入图片描述
    key: 键值对中key的类型
    T: 键值对中value的类型
    Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比
    较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户
    自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
    Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的
    空间配置器
    注意:在使用map时,需要包含头文件。

使用map的一些代码:

void test_map()
{map<string, string> mymap;//初始化map的方式pair<string, string>kv("sort", "排序");mymap.insert(kv);mymap.insert(pair<string, string>("string", "字符串"));mymap.insert(make_pair("insert", "插入"));//map也有去重功能。 不插入,不覆盖,插入过程中只比较key,不管value,key相同就不可以插入了//C++11支持这样写mymap.insert({ "insert","xxx" });map<string, string>::iterator it = mymap.begin();while (it != mymap.end()){cout << it->first << ":" << it->second << endl;it++;}cout << endl;//范围forfor (const auto& kv : mymap){cout << kv.first << ":" << kv.second << endl;}
}

好的,我们下一篇再见!

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

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

相关文章

报错sql_mode=only_full_group_by

首发博客地址 https://blog.zysicyj.top/ 报错内容 ### The error may exist in file[D:\code\cppCode20221025\leader-system\target\classes\mapper\system\TJsonDataMapper.xml] ### The error may involve defaultParameterMap ### The error occurred while…

软件工程(二十) 系统运行与软件维护

1、系统转换计划 1.1、遗留系统的演化策略 时至今日,你想去开发一个系统,想完全不涉及到已有的系统,基本是不可能的事情。但是对于已有系统我们有一个策略。 比如我们是淘汰掉已有系统,还是继承已有系统,或者集成已有系统,或者改造遗留的系统呢,都是不同的策略。 技术…

AI 绘画Stable Diffusion 研究(十五)SD Embedding详解

大家好&#xff0c;我是风雨无阻。 本期内容&#xff1a; Embedding是什么&#xff1f;Embedding有什么作用&#xff1f;Embedding如何下载安装&#xff1f;如何使用Embedding&#xff1f; 大家还记得 AI 绘画Stable Diffusion 研究&#xff08;七&#xff09; 一文读懂 Stab…

C语言——程序执行的三大流程

顺序 : 从上向下&#xff0c; 顺序执行代码分支 : 根据条件判断&#xff0c; 决定执行代码的分支循环 : 让特定代码重复的执行

App卡帧与BlockCanary

作者&#xff1a;图个喜庆 一&#xff0c;前言 app卡帧一直是性能优化的一个重要方面&#xff0c;虽然现在手机硬件性能越来越高&#xff0c;明显的卡帧现象越来越少&#xff0c;但是了解卡帧相关的知识还是非常有必要的。 本文分两部分从app卡帧的原理出发&#xff0c;讨论屏…

ROS中使用Navigation报错信息

在ROS中使用遇到了几个Navigation报错信息&#xff0c;在这里进行下记录&#xff1a; [ WARN] [1688134727.429227824]: The origin for the sensor at (7.35, 13.12) is out of map bounds. So, the costmap cannot raytrace for it. 解决办法&#xff1a; [ WARN] [16881…

基于梯度算法优化的BP神经网络(预测应用) - 附代码

基于梯度算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于梯度算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.梯度优化BP神经网络2.1 BP神经网络参数设置2.2 梯度算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

如何选择合适的量化交易服务器

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

Android | 关于 OOM 的那些事儿

作者&#xff1a;345丶 前言 Android 系统对每个app都会有一个最大的内存限制&#xff0c;如果超出这个限制&#xff0c;就会抛出 OOM&#xff0c;也就是Out Of Memory 。本质上是抛出的一个异常&#xff0c;一般是在内存超出限制之后抛出的。最为常见的 OOM 就是内存泄露(大量…

尚硅谷大数据项目《在线教育之离线数仓》笔记004

视频地址&#xff1a;尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 第9章 数仓开发之DWD层 P049 P050 P051 P052 P053 P054 P055 P056 P057 P058 P059 P060 P061 P062 P063 P064 P065 P066 P067 P068 P069 P070 第9章 数仓开发之DWD…

lib61850 学习笔记一 (概念)

IEC61850 定义60多种服务满足变电站通信需求。支持在线获取数据模型&#xff0c;也支持IED水平通信&#xff08;GOOSE报文&#xff09; 术语定义 间隔 bay: 变电站由据应公共功能紧密连接的子部分组成。 例如 介于进线或者 出线 和母线之间的断路器&#xff1b;二条母线之间…

2023-08-28 LeetCode每日一题(插入区间)

2023-08-28每日一题 一、题目编号 57. 插入区间二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的…