set和multiset的用法详解

2023-11-20

一、set文档介绍

1. set是按照一定次序存储元素的容器

2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素 不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。

3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。

4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直 接迭代。

5. set在底层是用二叉搜索树(红黑树)实现的。

注意:

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

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

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

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

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

6. set中查找某个元素,时间复杂度为:$log_2 n$

7. set中的元素不允许修改(底层使用二叉搜索树实现的)

8. set中的底层使用二叉搜索树(红黑树)来实现。

总结一下,set最重要的几个功能:

1、判断在还是不在

2、去重

3、排序

二、set常用接口举例

1、排序+去重

void test()
{
	int array[] = { 1, 1, 2, 2, 3, 3, 8, 5, 6 };
	set<int> s(array, array + sizeof(array) / sizeof(int));
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl; 
}
int main()
{
	test();
	system("pause");
	return 0;
}

输出结果:

2、插入元素的时候,元素已经存在的不插入

void test()
{
	int array[] = { 1, 1, 2, 2, 3, 3, 8, 5, 6 };
	set<int> s(array, array + sizeof(array) / sizeof(int));
	s.insert(2);
	s.insert(3);
	s.insert(9);
	s.insert(10);
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl; 
	
}

输出结果:

3、构建键值对插入:pair insert ( const value_type& x )

在set中插入元素x,实际插入的是构成的键值对, 如果插入成功返回(该元素在set中的位置,true),如果插入失败,说明x在set中已经存在,返回(x在set中的位 置,false).

void test()
{
	int array[] = { 1, 1, 2, 2, 8, 5, 6 };
	set<int> s(array, array + sizeof(array) / sizeof(int));
	set<int>::iterator it;
	pair<set<int>::iterator, bool> ret;
	ret = s.insert(1);
	if (ret.second == false)
	{
		it = ret.first;
	}
	s.insert(it,2);
	s.insert(it,3);
	s.insert(it,9);
	s.insert(it,10);
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl; 
}

输出结果:

4、iterator insert ( iterator position, const value_type& x)

在set的position位置插入x,实际插入的是构成的键值对,注意:position位置只是参考,x最终不一定在该位置。

三、与multiset的区别

1、set与multiset最大的区别是multiset中的元素可以重复

下面举例说明:

void test()
{
	int array[] = { 1, 1, 2, 2, 8, 5, 6 };
	multiset<int> s(array, array + sizeof(array) / sizeof(int));
	s.insert(2);
	s.insert(3);
	s.insert(9);
	s.insert(10);
	for (auto& e:s)
	{
		cout << e << " ";
	}
	cout << endl; 
	
}

输出结果:

所以排序的时候选择multiset较为方便。

2、使用multiset查找重复元素时,找到的是中序访问的第一个元素

下面用一段代码举例说明:

void test()
{
	int array[] = { 1, 1, 2, 2, 8, 5, 6 };
	multiset<int> s(array, array + sizeof(array) / sizeof(int));
	multiset<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout <<endl;
	it = s.find(2);
	cout << *it << endl;
	it++;
	cout << *it << endl;
	it++;
	cout << *it << endl;
	it++;
}

输出结果:

因为multiset底层是一个搜索二叉树,按中序遍历刚好是排完序的,由输出结果可知,找到的是中序遍历的第一个数。

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

set和multiset的用法详解 的相关文章

随机推荐

  • 盘点3款超好用的免费录屏软件,快来看!

    在现代数字化社会中 录屏软件成为了各行各业中必备的工具之一 用于记录操作步骤 制作教程 分享游戏精彩瞬间等 而寻找一款免费的 功能强大的录屏软件也变得越来越重要 本文将为您介绍3款免费录屏软件 并详细说明使用步骤 帮助您找到适合自己需求的录
  • 制作OLED图标

    制作OLED图标 陈拓 2021 06 24 2021 06 26 1 概述 制作用于OLED显示的图标 获取C语言图像点阵数据 2 图标库 先准备图标图像 可以从图标库中找需要的图案 下面两个是我常用的图标网站 2 1 Font Awes
  • 什么是gdb,gdb的简单用法

    在Linux中 gdb是GNU调试器 GNU debugger 的缩写 它是一个强大的命令行调试工具 用于调试C C 和其他编程语言的程序 使用gdb可以执行以下任务 启动程序并逐行执行代码 设置断点 以便在特定位置停止程序执行 检查变量的
  • php漏洞eval,Web安全之代码执行漏洞

    原标题 Web安全之代码执行漏洞 内容 1 代码执行漏洞的概述 2 代码执行漏洞的危害 3 代码执行漏洞的利用 4 代码执行漏洞的防御 背景介绍 在Web应用中有时候程序员为了考虑灵活性 简洁性 会在代码调用eval函数 PHP函数 去处理
  • oracle imp lrm 00101,LRM-00101: unknown parameter name解决办法

    LRM 00101 unknown parameter name解决方法 点击右边红色标题查看本文完整版 LRM 00101 unknown parameter name解决方法 SQL gt startup pfile d oracle
  • 2023华为od机试 Python【比赛冠军】

    题目 我们现在有若干个运动员 每个运动员有自己独特的id 每个运动员的能力不同 比赛按照如下规则进行 0号和1号 2号和3号 以此类推 在每一轮比赛中 获胜的进入下轮 输入描述 输入一行N个数字代表N的运动员的实力值 输出冠亚季军的id 用
  • 逻辑思维训练题

    1 估算你所在城市理发店的数量 https www jianshu com p 1431daad2c62 这种思维方式的核心 就是把你要探索的结果用一个数理公式展示出来 我们用最开始的煎饼摊例子来看怎么算 就要用到 利润 收入 变动成本 而
  • 用于包管理的基本命令APT-GET和APT-CACHE

    这篇文章解释你如何快速学习从命令行使用apt get和apt cache安装 移除 升级和搜索软件包 这篇文章提供一些有用命令 它们将帮助你在基于Debian Ubuntu的系统中处理包管理 apt get是什么 apt get工具是一个强
  • Flutter基础Dart单例的实现

    引言 在日常开发搭建基础框架时 常常用到全局使用的数据类或者工具类 比如日期工具类 地图工具类等 在项目一般使用几种单例类来分享心得 有类实例方式 工厂方式以及类静态方式 实例方式 使用DartPad cn网站来练习dart简单代码片段还是
  • [QT编程系列-40]:QML语言简介

    目录 第1章 简介 第2章 QT QML示例 第三章 QML的步骤 第1章 简介 QML Qt Meta Object Language 是Qt框架中用于构建用户界面的声明性语言 它是一个轻量级的语言 用于描述界面的结构和行为 使开发人员能
  • 樱花动漫中的视频下载分析

    昨天有个朋友问我樱花动漫中的视频怎么下载 那么今天我就写篇文章来专门分析下樱花动漫中的视频是怎么下载的 1 还是打开我们的马赛克视频助手 来分析樱花动漫的数据包 当然你们也没有用其他的抓包工具 不过我习惯了用这个 可以使用它的转到来源功能
  • EPI distortion correction形变矫正, eddy, fieldmap等五种不同方法

    EPI distortion correction形变矫正 1 topup eddy 2 fieldmap eddy 2 1 对mag做去脑壳 2 2 基于去过脑壳的mag 1volume bet nii gz数据 对fieldmap进行预
  • STM32 FLASH操作

    STM32 的闪存模块由 主存储器 信息块和闪存存储器接口寄存器等 3 部分组成 主存储器 该部分用来存放代码和数据常数 如 const 类型的数据 对于大容量产品 其被划分为 256 页 每页 2K 字节 注意 小容量和中容量产品则每页只
  • 解决iframe在ios中无法滚动的bug

    在解决iframe在ios无法滚动的bug中 需要在iframe外面包裹一层div 如下 div class scroll wrapper div 然后设置scroll wrapper的样式 给scroll wrapper添加 webkit
  • camunda 流程引擎如何开始并行任务,且有哪些实现方式?

    认识并行任务 在流程引擎开发中 稍微复杂一点的项目都会遇到并行任务 什么是并行任务呢 就是在完成一个流程节点后 下一步会同时开始多个任务 且任务与任务之间互不影响 这个说起来真的有点绕 刚开始我真不理解 试了好多次才想明白 下面就画2条不同
  • 错误的分页写法及修改

    一 错误的写法 api GetMapping groupList ApiImplicitParams ApiImplicitParam name current value 页码 required true dataType Long da
  • MMdetection学习笔记 第一步安装配置

    安装 之前的安装老是出问题 这里重新仔细进行第三遍 参考了哔哩哔哩的视频教程 mmdetection 教程 使用篇 https www bilibili com video BV1Jb4y1r7ir p 3 share source cop
  • Qt(windows下)捕获异常信息并自动重启

    参考 https blog csdn net x85371169 article details 79267592 目前在弄一个工业上用的软件 需要实现无人值守功能 软件经过两三个星期的debug 已经将绝大部分导致软件死机的bug修复 但
  • 使用burpsuite对web进行账号密码暴力破解

    一 打开环境 1 打开php 2 打开burp suite 3 打开小狐狸 进入127 0 0 1 pikachu 二 Repeater 重发器 1 访问pikachu 多次进行用户名和密码的登录 描述 2 burp suite 中抓包 3
  • set和multiset的用法详解

    一 set文档介绍 1 set是按照一定次序存储元素的容器 2 在set中 元素的value也标识它 value就是key 类型为T 并且每个value必须是唯一的 set中的元素 不能在容器中修改 元素总是const 但是可以从容器中插入