当前位置:   article > 正文

【C++】详解 set | multiset_c++ set

c++ set

目录

1.集合类 set

0.引入

1.set 介绍

1. 构造

2.Insert 插入

3.find 查找

4.count 判断是否在

5.erase 删除

6.lower_bound 和 upper_bound 区间查找

拓展:lower_bound 函数底层实现

equal_range 值区间

2.multiset 类

0.引入:不去重的 set

1.增删查改


1.集合类 set

0.引入

首先要知道的是序列式容器,这种容器我们之前接触过,比如vector,list,deque等等。

序列式容器:

底层为线性的数据结果(物理上或者逻辑上),容器中的元素储存的是元素本身。

而且我们之前在使用序列式容器的时候,插入数据和删除数据只管操作就行,不用考虑其他因素。

关联式容器:

存储的是<key,value>结构的键对值,在数据检索时比序列式容器效率更高。

插入和删除数据时,要考虑该数据和它前后数据之间的关联性。

总的来说,关联式容器存放的数据不同,而且数据前后有一点的关联性

1.set 介绍

通过插入新的元素来扩展容器,有效地通过插入的元素数量增加容器的大小。

因为集合中的元素是唯一的,插入操作检查每个插入的元素是否等同于已经在容器中的元素。

如果是,则不插入该元素,返回一个到这个现有元素的迭代器(如果该函数返回一个值)。

头文件:#include <set>

set和之前学习的容器一样,也是一个模板类,但是它的底层是关联式容器,也就是二叉搜索树,并且有很多的成员函数

1. 构造

构造函数有三个,分别是默认构造函数、使用迭代器区间的构造函数、拷贝构造函数。

因为底层是二叉搜索树,所有就会涉及到比较,构造函数参数就是比较方式,是一个仿函数,但是默认情况下是有缺省值的。

  1. #include<iostream>
  2. #include<set>
  3. using namespace std;
  4. int main()
  5. {
  6. int arr[] = { 9,5,1,4,7,6,2,3,5,5,5,5,5 };
  7. set<int> s2(arr, arr + sizeof(arr) / sizeof(arr[0]));
  8. //迭代器区间构造
  9. for (auto& e : s2)//取别名
  10. {
  11. cout << e << " ";
  12. }
  13. cout << endl;
  14. return 0;
  15. }

迭代器区间构造s2的时候,会发现其有 排序+去重

  1. 数组中有多个重复数字,用这些数字构造出来的set,里面每个数字只存在一个,重复的都被去除了。(如果想知道去重次数 map)
  2. 迭代器的中序移动:在打印set中的数据时,我们发现打印出来的结果是升序的,在学习二叉搜索树的时候我们知道,采用中序遍历的方式打印出来的结果就是升序的。

接下来让我们来学习一下 set 的各种接口

2.Insert 插入

下面我们来简单来一下

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/894430
推荐阅读
相关标签