set和multiset的用法详解
一、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底层是一个搜索二叉树,按中序遍历刚好是排完序的,由输出结果可知,找到的是中序遍历的第一个数。
set和multiset的用法详解相关推荐
- STL迭代器(iterator)用法详解
C++ STL迭代器(iterator)用法详解 无论是序列容器还是关联容器,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用"迭代器(iterator)"来实 ...
- c 语言中set的用法,C++中set用法详解
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- C++ STL容器 —— map/multimap 用法详解
C++ STL容器 -- map/multimap 用法详解 写在前面:近期正在学习C++的STL容器,因此在这里做一下日志记录,主要介绍一些容器基本成员函数的用法, 配上实际用例,并不涉及原理.但别 ...
- python argv 详解_Python3 sys.argv[ ]用法详解
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...
- oracle中的exists 和 not exists 用法详解
from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...
- ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...
- python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解
本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...
- C++中substr()函数用法详解
C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...
- php theme_path,PHP_Yii2主题(Theme)用法详解,本文实例讲述了Yii2主题(Theme) - phpStudy
Yii2主题(Theme)用法详解 本文实例讲述了Yii2主题(Theme)用法.分享给大家供大家参考,具体如下: 首先看看主要的配置方式: 'components' => [ 'view' = ...
最新文章
- 单用户模式迁移home家目录
- Mysql5.7的gtid主从半同步复制和组复制
- 【Python + Selenium】之JS定位总结
- linux 防火墙 ftp,RedHat6 建立基于防火墙和SELinux的虚拟用户vsFTP
- 递增输出链表结点,删除重复结点
- find_package()的查找*.cmake的顺序
- MySQL学习(二、简单查询和多行、单行函数)
- 深度——强化学习、深度森林
- C/C++遍历文件夹指定文件
- r语言算巢式设计方差分析_R语言学习笔记(七):方差分析
- Vue定义全局常量,全局方法
- CISC 与 RISC 对比
- 百度网盘web登录页-原生js实现
- [c++]巧用stl库-啤酒与尿布
- PP模块常用数据库表
- 打麻将要诀,送给以前常输的你
- shogun-toolbox的使用方法和问题总结
- python实现画板_Python3使用PyQt5制作简单的画板/手写板
- mac 安装eclipse mat java内存分析工具
- PDF加密文件解密方法(解除复制打印限制)——转帖
热门文章
- VISP库IBVS仿真
- 2019 Multi-University Training Contest 6 - 1008 - TDL
- C语言实现Flybird
- 怎么用计算机ping组播地址,能正常Ping通组播源地址
- 义乌网络公司有关APP推广的渠道及
- Datawhale六月学习数据分析打卡task2
- 抢购最低价苹果!暴走香港直营店全攻略
- python图灵机器人_python与图灵机器人交互(WXPY版本)
- 15、Drools自然语言DSL,DSLR的说明——6.4版本
- 【手拉手 带你准备电赛】April Tag标记跟踪(3D定位)详解