Skip to content

STL-set 学习笔记

set 简介

set 是一种包含已排序对象的关联容器。

set/multiset 会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许

set 的特点:

  1. 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,再插入新元素
  2. 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数
  3. 元素比较动作只能用于类型相同的容器 (即元素和排序准则必须相同)

set 的底层实现:红黑树

常用操作:

函数功能
begin()返回指向第一个元素的迭代器
end()返回指向最后一个元素的迭代器
clear()清除所有元素
count()返回某个值元素的个数
empty()如果集合为空,返回 true
equal_range()返回集合中与给定值相等的上下限的两个迭代器
erase()删除集合中的元素
find()返回一个指向被查找到元素的迭代器
get_allocator()返回集合的分配器
insert()在集合中插入元素
lower_bound()返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()返回一个用于元素间值比较的函数
max_size()返回集合能容纳的元素的最大限值
rbegin()返回指向集合中最后一个元素的反向迭代器
rend()返回指向集合中第一个元素的反向迭代器
size()返回集合中元素的数目
swap()交换两个集合变量
upper_bound()返回大于某个值元素的迭代器
value_comp()返回一个用于比较元素间值的函数

自定义 set

可以使用仿函数或者 greater<T> 或者 重载 < > 运算符来实现自定义规则乃至自定义类型的排序

CAUTION

set 底层插入的逻辑是对插入元素调用两次 cmp 函数,其中两次参数互换,若两次结果都为 false , 则判断为重复元素,都为 true 则可能会引发错误,或是预料之外的重复操作乃至死循环

因此,在 set 中插入带有两个或以上值的元素的时候,即使没有对所有值排序的需求,也需要在 cmp 中写多级比较,否则像 [a,b][a,c] 这两个元素就会被判定为相同的元素,从而不全被插入