一、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的用法详解相关推荐

  1. STL迭代器(iterator)用法详解

    C++ STL迭代器(iterator)用法详解 无论是序列容器还是关联容器,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用"迭代器(iterator)"来实 ...

  2. c 语言中set的用法,C++中set用法详解

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  3. C++ STL容器 —— map/multimap 用法详解

    C++ STL容器 -- map/multimap 用法详解 写在前面:近期正在学习C++的STL容器,因此在这里做一下日志记录,主要介绍一些容器基本成员函数的用法, 配上实际用例,并不涉及原理.但别 ...

  4. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  5. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  6. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  7. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  8. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  9. php theme_path,PHP_Yii2主题(Theme)用法详解,本文实例讲述了Yii2主题(Theme) - phpStudy

    Yii2主题(Theme)用法详解 本文实例讲述了Yii2主题(Theme)用法.分享给大家供大家参考,具体如下: 首先看看主要的配置方式: 'components' => [ 'view' = ...

最新文章

  1. 单用户模式迁移home家目录
  2. Mysql5.7的gtid主从半同步复制和组复制
  3. 【Python + Selenium】之JS定位总结
  4. linux 防火墙 ftp,RedHat6 建立基于防火墙和SELinux的虚拟用户vsFTP
  5. 递增输出链表结点,删除重复结点
  6. find_package()的查找*.cmake的顺序
  7. MySQL学习(二、简单查询和多行、单行函数)
  8. 深度——强化学习、深度森林
  9. C/C++遍历文件夹指定文件
  10. r语言算巢式设计方差分析_R语言学习笔记(七):方差分析
  11. Vue定义全局常量,全局方法
  12. CISC 与 RISC 对比
  13. 百度网盘web登录页-原生js实现
  14. [c++]巧用stl库-啤酒与尿布
  15. PP模块常用数据库表
  16. 打麻将要诀,送给以前常输的你
  17. shogun-toolbox的使用方法和问题总结
  18. python实现画板_Python3使用PyQt5制作简单的画板/手写板
  19. mac 安装eclipse mat java内存分析工具
  20. PDF加密文件解密方法(解除复制打印限制)——转帖

热门文章

  1. VISP库IBVS仿真
  2. 2019 Multi-University Training Contest 6 - 1008 - TDL
  3. C语言实现Flybird
  4. 怎么用计算机ping组播地址,能正常Ping通组播源地址
  5. 义乌网络公司有关APP推广的渠道及
  6. Datawhale六月学习数据分析打卡task2
  7. 抢购最低价苹果!暴走香港直营店全攻略
  8. python图灵机器人_python与图灵机器人交互(WXPY版本)
  9. 15、Drools自然语言DSL,DSLR的说明——6.4版本
  10. 【手拉手 带你准备电赛】April Tag标记跟踪(3D定位)详解