STL-set 学习笔记
set 简介
set
是一种包含已排序对象的关联容器。
set
/multiset
会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许
set 的特点:
- 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,再插入新元素
- 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数
- 元素比较动作只能用于类型相同的容器 (即元素和排序准则必须相同)
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]
这两个元素就会被判定为相同的元素,从而不全被插入