C++:map和set

2023-11-17

一、set

1.set的介绍

set 是一个Key模型的搜索二叉树 #include<set>

2.insert 

 insert :排序 + 去重

void test_set1()
{
	set<int> s;
	s.insert(3);
	s.insert(4);
	s.insert(2);
	s.insert(1);
	s.insert(5);
	s.insert(3);
	s.insert(2);
	s.insert(1);

	// 排序 + 去重 
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		//*it = 10;    迭代器不支持修改
		cout << *it << " ";
		++it;
	}
	cout << endl;

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
}

 

 3.find

 能找到就返回元素的迭代器,找不到就返回end

set::find 搜索二叉树特性查找,时间复杂度是O(logN)

全局的find 是暴力查找,时间复杂度是O(N)

void test_set2()
{
	set<int> s;
	s.insert(3);
	s.insert(4);
	s.insert(2);
	s.insert(1);
	s.insert(5);
	s.insert(3);
	s.insert(2);
	s.insert(1);

	set<int>::iterator pos = s.find(2);  // O(logN)
	if (pos != s.end())
	{
		cout << "set.find找到了" << endl;
	}

	pos = find(s.begin(), s.end(), 2); // O(N)
	if (pos != s.end())
	{
		cout << "find找到了" << endl;
	}
}

4.erase

void test_set3()
{
	set<int> s;
	s.insert(3);
	s.insert(4);
	s.insert(2);
	s.insert(1);
	s.insert(5);
	s.insert(3);
	s.insert(2);
	s.insert(1);
	cout << s.erase(3) << endl;    //有就返回1
	cout << s.erase(30) << endl;   //没有就返回0

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;

	set<int>::iterator pos = s.find(3);
	if (pos != s.end())
		s.erase(pos);

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;

}

 

 5.swap

6.count 

void test_set4()
{
	set<int> s;
	s.insert(3);
	s.insert(4);
	s.insert(2);
	s.insert(1);
	s.insert(5);
	s.insert(3);
	s.insert(2);
	s.insert(1);

	cout << s.count(2) << endl;
	cout << s.count(5) << endl;

	cout << s.count(20) << endl;
}

 

7.lower_bound 

返回>= val的位置迭代器

用途:删除>=val的所有值

void test_set5()
{
	set<int> s;
	s.insert(3);
	s.insert(4);
	s.insert(2);
	s.insert(1);
	s.insert(5);
	s.insert(3);
	s.insert(2);
	s.insert(1);
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;

	// 要求删除>=x的所有值
	int x;
	cin >> x;
	set<int>::iterator lowIt = s.lower_bound(x);
	s.erase(lowIt, s.end());

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
	
}

 8.upper_bound

 返回>x位置的迭代器

9.multiset

插入重复的数时set会去重,multiset不去重,允许冗余 

multiset 的count和erase 返回查找或删除个数

find(x) 多个x的话,find返回中序第一个x

void test_set6()
{
	multiset<int> s;
	s.insert(3);
	s.insert(4);
	s.insert(2);
	s.insert(1);
	s.insert(5);
	s.insert(3);
	s.insert(2);
	s.insert(1);
	s.insert(8);
	s.insert(9);
	set<int>::iterator it = s.begin();    //迭代器打印
	while (it != s.end())
	{
		//*it = 10;
		cout << *it << " ";
		++it;
	}
	cout << endl;

	for (auto e : s)        //范围for打印
	{
		cout << e << " ";
	}
	cout << endl;

	cout << s.count(1) << endl;    //测试count,打印2,因为1有2个
	cout << s.erase(1) << endl;    //测试erase,打印2,因为1有2个
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;

	auto pos = s.find(3);         // 多个x的话,find返回中序第一个x
	while (pos != s.end())        //从中序第一个3开始打印完整个
	{
		cout << *pos << " ";
		++pos;
	}
	cout << endl;

}

二、map 

map是Key_val模型的搜索二叉树,insert和[]用法是重点,其他用法参考set        #include<map>

几个map和set的冷知识:

map:

①map是C++98中已存在的,unordered_map是C++11中才有的
②map中都重载了[]运算符,multimap中没有重载[]运算符,set也没有重载[]。
原因:map中key是唯一的,每个key都有与之对应的value,经常需要通过key获取value,因此 map为了形象简单 就重载了[]运算符, multimap中key是可以重复的,如果重载了[]运算符,给定 一个key时,就没有办法返回     value了,因此,multimap中没有重载[]运算符

③map中key不能修改,因为如果修改了就不能保证红黑树的有序特性了
set:

①set中也可以存储键值对,实例化set时,将set中元素类型设置为pair即可

②set默认是升序,但是其内部默认不是按照大于比较,而是按照 less小于比较

less是把小的放左边,所以是升序;greater是把大的放左边,所以是降序

③map和set查询的时间复杂度都是O(log_2N)

解释:map和set的底层结构都是红黑树,而红黑树是近似的平衡二叉搜索树,故查询时间复杂度为O(log_2N)

④map和set底层都是使用红黑树实现的

pair

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代
表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然
有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应
该单词,在词典中就可以找到与其对应的中文含义。
pair 打包了KV模型的key和val两个类型的值,c++不支持返回两个值,也就不知道返回key和val哪一个了,所以干脆打包key和val,返回一个pair结构

make_pair

make_pair 相当于返回了一个pair的匿名对象

 


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:map和set 的相关文章

  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析

随机推荐

  • Java常见排序:(三)快速排序

    快速排序是一种非常快的交换排序方法 思路很简单 将待排的数据序列中任意取一个数据作为分界值 所有比这个值小的放在左边 比他大的放在右边 形成左右两个子序列 左边的值都比分界值小 右边的值都比分界大 接下来对左右两个子序列进行递归 两个子序列
  • flask-项目实操2

    基本目录搭建 apps cms 后台 front 前台 common 共有的 static 静态 css cms front templates 模版html cms front bbs py 程序的入口 config py 配置文件 ma
  • 蓝桥杯——砝码称重(DP求解)

    问题描述 你有一架天平和 N个砝码 这 N个砝码重量依次是 W1 W2 Wn 请你计算一共可以称出多少种不同的重量 注意砝码可以放在天平两边 输入格式 输入的第一行包含一个整数 N 第二行包含 N个整数 W1 W2 W3 WN 输出格式 输
  • Java 截取String类型字符串截掉后两位

    String strhours String valueOf 123456 String strh strhours substring strhours length 2 strhours length 截取 String strm st
  • 2021-04-21--中标麒麟--yum源修改

    在安装 中标麒麟V7 后 执行 yum y update 会提示这样信息 无法拿到更新包 原因出自yum源的问题 而网上的麒麟源好多包都不能用 总结了一下 以下方法最实用 确实最快的 但是要求能够联网 如下 1 前提找到查看版本 查看版本的
  • 【网络安全】远程登陆虚拟专网实验

    远程登陆虚拟专网实验 文章目录 远程登陆虚拟专网实验 01 实验拓扑 02 实验命令 无客户端的SSL 胖客户端的SSL 03 实验过程 先进行无客户端的SSL实验过程 在WIN7上开启telnet服务 在XP上开启telnet服务 在WI
  • 计算机组成原理--基于Logisim的海明校验码解码电路实验的应用(超详细/设计/实验/作业/练习)

    目录 课程名 计算机组成原理 内容 作用 设计 实验 作业 练习 学习 基于Logisim的海明校验码解码电路 一 前言 二 环境与设备 三 内容 四 结果与分析 课程名 计算机组成原理 内容 作用 设计 实验 作业 练习 学习 基于Log
  • VueRouter: this.$route.push跳转,携带参数

    this router push传递参数有2种方式 传递参数 this router push path 路由 query key value 参数取值 this route query key 使用这种方式 传递参数会拼接在路由后面 出现
  • pc计算机参数表示什么,电脑cmos是什么意思?详细介绍cmos

    目前关于到电脑cmos是什么意思 CMOS简介这一类的信息是很多小伙伴们都非常关心的 很多人也是经常在搜索关于电脑cmos是什么意思 CMOS简介方面的信息 那么既然现在大家都想要知道此类的信息 小编就收集了一些相关的信息分享给大家 今天有
  • uniapp + uview —— 上传图片

    index vue
  • 显卡的相关性能参数含义(struct cudaDeviceProp)

    中文译注 英文见下文 struct cudaDeviceProp char name 256 器件的名字size t totalGlobalMem Global Memory 的byte大小size t sharedMemPerBlock
  • 手机报错:config:invalid signature问题;网页开发工具报错:config:fali,Error:系统错误,错误码:63002,invalidsignature问题

    折腾了几天发现是 java老哥单词少了一个字母 官方建议 invalid signature签名错误 建议按如下顺序检查 1 确认签名算法正确 可用http mp weixin qq com debug cgi bin sandbox t
  • spark算子执行位置研究,driver端?executor端?

    参考资料 https cloud tencent com developer article 1545723 前言 spark算子的执行位置 driver端 还是executor端 这些之前其实没有注意过 最近在学流处理 发现这个还是很重要
  • Ubuntu20.04 添加右键新建文件

    1 在主文件夹 模板目录下创建一个文件 如下指令 ubuntu ubuntu Templates sudo gedit 2 创建了文件后 直接点击保存即可 3 这时在其他目录下点击右键就可以看到新建文档
  • oracle比较两个时间

    to char date字段 HH24 MI SS between 07 00 00 and 09 30 00 或者 to char date字段 HH24 MI SS gt 07 00 00 and to char date字段 HH24
  • 在HTML中怎么去掉超链接(标签 a)的下划线?

    转自 http zhidao baidu com question 253614370 html qbl relate question 0 word a 20 C8 A5 CF C2 BB AE CF DF a href 超链接 a
  • 【C++·Qt】Qt信号与槽总结

    信号槽是Qt为我们提供的引以为傲的机制之一 它类似设计模式中的观察者模式 观察者模式是一种对象行为模式 它定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变时 所有依赖于它的对象都得到通知并被自动更新 当某个信号signal发出时
  • 数据结构——链表一网打尽

    目录 前言 函数的传参 不带头单向非循环链表 带头双向循环链表 顺序表与链表的优缺点 单链表源码 带头双向循环链表源码 前言 链表是一种物理存储结构上非连续非线性的结构 数据元素的逻辑顺序通过指针次序链接实现 在逻辑结构上好像通过链子链接起
  • html编译器推荐

    学习html 这种简单的网页语言 我推荐大家使用 Sublime Text 代码编译器 本人是个痛快之人 推荐理由简单说 一 编译窗口看着舒服 代码自带颜色 是种高大上的美 二 功能强大 强大到你目前学习html不用以你现在的水平去担心功能
  • C++:map和set

    一 set 1 set的介绍 set 是一个Key模型的搜索二叉树 include