1.结构

set和multiset会根据特定的排序原则将元素排序。两者不同之处在于,multisets允许元素重复,而set不允许重复。

set中的元素可以是任意类型的,但是由于需要排序,所以元素必须有一个序,即大小的比较关系,只要是assignable、copyable、comparable(根据某个排序准则)的型别T,都可以成为set或者multisets的元素。

2.底层实现

和所有的标准关联容器类似,sets和multisets通常以平衡二叉树完成。

自动排序的主要优点在于使二叉树搜寻元素具有良好的性能,在其搜索函数算法具有对数复杂度。但是自动排序也造成了一个限制,不能直接改变元素值,因为这样会打乱原有的顺序,要改变元素的值,必须先删除旧元素,再插入新元素。所以sets和multisets具有以下特点:
-不提供直接用来存取元素的任何操作元素。
-通过迭代器进行元素的存取。

3.成员函数

  1. begin()--返回指向第一个元素的迭代器
  2. clear()--清除所有元素
  3. count()--返回某个值元素的个数
  4. empty()--如果集合为空,返回true
  5. end()--返回指向最后一个元素的迭代器
  6. equal_range()--返回集合中与给定值相等的上下限的两个迭代器
  7. erase()--删除集合中的元素
  8. find()--返回一个指向被查找到元素的迭代器
  9. get_allocator()--返回集合的分配器
  10. insert()--在集合中插入元素
  11. lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
  12. key_comp()--返回一个用于元素间值比较的函数
  13. max_size()--返回集合能容纳的元素的最大限值
  14. rbegin()--返回指向集合中最后一个元素的反向迭代器
  15. rend()--返回指向集合中第一个元素的反向迭代器
  16. size()--集合中元素的数目
  17. swap()--交换两个集合变量
  18. upper_bound()--返回大于某个值元素的迭代器
  19. value_comp()--返回一个用于比较元素间的值的函数
什么时候需要用multiset?

当然是需要用set,但是又允许重复key存在的时候了。

什么时候用set?

需要随时往容器中插入元素,随时对元素进行快速查找,又需要按某种顺序对元素进行遍历的时候.

4.需要注意的地方

1.multiset::count(key)的返回值可能大于1。(因为插入了多个关键值)
2.multiset::size()的返回值是多重集合的势(cardinality),即multiset中元素的个数,而不是值的个数。比如,{1, 1, 2}的size是3,而不是2。
3.multiset::erase(key)会将对应的key全部删掉,所以对{1, 1, 2}调用erase(1)之后,它就变成了{2}。如果只想删除对应位置的key,erase的参数可以设置为迭代器,比如erase(lower_bound(n)),意味删除大于或等于值为n的第一个元素。
4.只要key存在于集合中,set::equal_range(key)的返回值pair<iterator1, iterator2>总是会有++iterator1 == iterator2。但是对multiset来说就不一定了。

最新文章

  1. linux:lnmp环境搭建
  2. mysql Access denied for user \&#39;root\&#39;@\&#39;localhost\&#39;”解决办法总结,下面我们对常见的出现的一些错误代码进行分析并给出解决办法,有需要的朋友可参考一下。
  3. 将Cell中的视图取出传递到根视图
  4. php禁用一些重要功能
  5. mysql生成百万级数量测试数据
  6. 2.postman安装及使用
  7. 【转载】看StackOverflow如何用25台服务器撑起5.6亿的月PV
  8. git push 到github时,报错:ERROR: Permission to xxx.git denied to user
  9. JDBC 初始。
  10. ES6 扩展运算符 三点(...)
  11. Spring Boot IoC 容器初始化过程
  12. 【设计模式】—— 中介者模式Mediator
  13. Oracle:oracle 12.1.0.2 升级到12.2.0.1 后,自动任务报错:ORA-20001: Statistics Advisor: Invalid task name for the current user
  14. 将UIView转成UIImage,将UIImage转成PNG/JPG
  15. C++(笔记)浅析vector容器的实例
  16. jq限制字符个数
  17. 模板—算法—整体二分(区间k小值)
  18. ssl生成证书
  19. SVN环境搭建(1)
  20. 基于vue框架项目开发过程中遇到的问题总结(一)

热门文章

  1. 96A
  2. 安装OpenSSL中出现的问题及解决
  3. Python的Pandas库简述
  4. webpack1.0--图片
  5. MySQL--5子查询与连接小结
  6. 正则表达式识别js跳转的链接
  7. robot framework自定义python库
  8. 【网络设备】某防火墙基于IP地址的目的地址转换
  9. webform非表单提交时防xss攻击
  10. Widget Factory (高斯消元解线性方程组)