STL——容器(Set & multiset)的概念和特点
1. Set 和 multiset 的概念
set 和 multiset 是一个集合容器,其中 set 所包含的元素是唯一的,集合中的元素按一定的顺序排列。set 采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比 vector 快。在n个数中查找目标数的效率是 log2N(2的多少次方等于N,这个效率非常之高,从16个单位中查找需要4次,64个单位需要6次……4,294,967,296个单位只需要32次)
红黑树定义是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:
1)节点是红色或黑色;
2)根节点是黑色;
3)所有叶子节点都是黑色节点(NULL);
4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
5)从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

2. Set 和 multiset 特点
1. set 中元素插入过程是按排序规则插入,所以不能指定插入位置(不能打破红黑树的位置结构)。
2. set 不可以直接存取元素,不可以使用 at.(pos) 和 [ ] 操作符。
3. multiset 与 set 的区别:set支持唯一键值,每个元素值只能出现一次;而 multiset 中同一值可以出现多次。
4. 不可以直接修改 set 或 multiset 容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素
5. 头文件 #include <set>
3. set 的使用举例
1 #include <iostream>
2 #include <set>
3
4 using namespace std;
5
6 int main()
7 {
8 set<int> setInt;
9
10 for (int i = 0; i < 10; i++)
11 {
12 setInt.insert(100 - i); //插入顺序为 100 99 98 97 96 95 94 93 92 91
13 }
14
15 setInt.insert(99); //再插入一个 99
16
17 for (set<int>::iterator it = setInt.begin(); it != setInt.end(); it++)
18 {
19 cout << *it << " "; //遍历后会发现不管你先插入多少,set 中已将数据从小到大排列,并且只有1个 99
20 }
21
22 cout << endl;
23
24 return 0;
25 }
打印结果中可以看到容器中的数据已经从小到大排列,并且中间再次插入的 99 不存在:

接下来使用一下 multiset,multiset 允许同一个元素多次存在:
1 #include <iostream>
2 #include <set>
3
4 using namespace std;
5
6 int main()
7 {
8 multiset<int> msetInt;
9
10 for (int i = 0; i < 10; i++)
11 {
12 msetInt.insert(100 - i); //插入顺序为 100 99 98 97 96 95 94 93 92 91
13 }
14
15 msetInt.insert(99); //再插入一个 99
16
17 for (set<int>::iterator it = msetInt.begin(); it != msetInt.end(); it++)
18 {
19 cout << *it << " "; //遍历后会发现不管你先插入多少,set 中已将数据从小到大排列,并且只有1个 99
20 }
21
22 cout << endl;
23
24 return 0;
25 }
打印结果:

======================================================================================================================
STL——容器(Set & multiset)的概念和特点的更多相关文章
- STL 容器的概念
STL 容器的概念 在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要. 经典的数据结构数量有限,但是我们 ...
- STL Set和multiset 容器
STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...
- STL——容器(List)List 的概念
1. List 容器的基本概念 1. list 是一个双向链表容器,可高效的进行插入删除元素,他的原理在于每个元素都有两个指针来记录前后两个元素的地址,像火车车厢一样,list 中各个元素在物理存储单 ...
- STL——容器(Set & multiset)的默认构造 & 带参构造 & 对象的拷贝构造与赋值
1. 默认构造 set<int> setInt; //一个存放int的set容器. set<float> setFloat; //一 ...
- 关于STL容器
容器: 概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它 分类: 序列容器.关联容器.容器 ...
- c++ STL容器初探
什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...
- STL容器读书笔记
vector vector维护的是一个连续线性空间 vector是动态空间,随着元素的加入会自动扩容,扩充至当前size的两倍,然后将原内容拷贝,开始在原内容之后构造新元素,并释放空间 vector提 ...
- 【STL容器学习】-关联容器与map的用法
STL提供了4个关联容器:set.multiset.map和multimap.这些容器提供了通过keyword高速存储和訪问数据元素的能力.Set和map不同意有反复keyword,而multiset ...
- 史上最全的各种C++ STL容器全解析
史上最全的C++ STL 容器大礼包 为什么\(C++\)比\(C\)更受人欢迎呢?除了\(C++\) 的编译令人感到更舒适,\(C++\)的标准模板库(\(STL\))也占了很重要的原因.当你还在用 ...
随机推荐
- bWAPP----PHP Code Injection
PHP Code Injection 主要代码 1 <div id="main"> 2 3 <h1>PHP Code Injection</h1> ...
- 安装mongodb扩展
curl -O https://pecl.php.net/get/mongodb-1.2.3.tgz tar zxf mongodb-1.2.3.tgzcd mongodb-1.2.3 phpize ...
- CorelDRAW中的合并和群组功能
在设计过程中,对象就是我们进行操作的主体,这个操作主体可以是单个对象,也可以是多个对象,在有多个对象要进行处理时,就需要用到类似CorelDRAW里的合并和群组这两个功能了. 一.合并与拆分 合并功能 ...
- FL Studio进行侧链的三种方式(上)
在本系列教程中,我们将学习如何在FL Studio中进行侧链.侧链是一种信号处理技术,通过它我们可以使用一个信号波形的振幅(音量)来控制另一个信号的某些参数.在电子音乐中,例如trance,house ...
- 企业安全01-Apache solr XML实体注入漏洞CVE-2017-12629
Apache solr XML 实体注入漏洞CVE-2017-12629 一.简介 Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apac ...
- Linux下使用Docker部署nacos-server(单机模式),丧心病狂的我在半夜给UCloud提交了一份工单
1. 拉取nacos-server镜像 进入 Docker Hub 查看nacos-server最新版本为 nacos-server:1.4.0 配置阿里云镜像加速 sudo mkdir -p /et ...
- 浅谈JAVA servlet
1.servlet是什么? servlet的本质是接口,接口就是一种规范.我们来看一下servlet接口中都有哪些函数: 图片来源:https://www.cnblogs.com/whgk/p/639 ...
- sqli-labs-master less05 及 Burp Suite暴力破解示例
一.首先测试显示内容 例:http://localhost/sqli-labs-master/Less-5/?id=1 http://localhost/sqli-labs-master/Less-5 ...
- CentOS虚拟化尝试
KVM ///确认cpu是否支持kvm,确认支持,主板还得开启VT和HT egrep '(vmx|svm)' --color=always /proc/cpuinfo ///yum安装rpm包 yum ...
- 红黑树、TreeMap、TreeSet
事先声明以下代码基于JDK1.8版本 参考资料 大部分图片引自https://www.jianshu.com/p/e136ec79235c侵删 https://www.cnblogs.com/skyw ...