推荐练习:Problem - B - Codeforces
Set 是什么
Set
数学上的集合——具有唯一性,即每个元素只出现一次,而 multiset
则是可重集,两者的内部实现是一棵红黑树,它们支持的函数基本相同。
set.size()
统计 set
中元素个数,函数返回一个整形变量,表示 set
中元素个数,时间复杂度 O(1)
set.empty()
检查 set
是否为空,返回一个 bool
型变量,1 表示 set
为空,否则为非空,时间复杂度O(1)
set.clear()
清空 set
,无返回值
set.count(x)
返回 set
或 multiset
中值为 x
的元素个数,时间复杂度为 O(k + logn)
set.begin()
返回集合的首迭代器,即指向集合中最小元素的迭代器,时间复杂度为 O(1)
set.end()
返回集合的尾迭代器,众所周知,STL 中区间都是左闭右开的,那么 end()
函数返回的迭代器即为指向集合中最大元素的下一个位置的迭代器,因此 --s.end()
才是指向集合中最大元素的迭代器,时间复杂度为 O(1)
set.insert(x)
在 set
中插入元素,返回插入地址的迭代器和是否插入成功的 bool
并成的 pair
,时间复杂度为 O(logn)
PS:set
在进行插入的时候是不允许有重复的键值的,如果新插入的键值与原有的键值重复则插入无效(multiset
可以重复)
set.erase(参数)
删除,参数可以是元素或者迭代器,返回下一个元素的迭代器,时间复杂度为 O(logn) ,注意在 multiset
中 s.erase(x)
会删除所有值为 x
的元素
auto itr = ms.find(*maxp);
if (itr != ms.end()) {
ms.erase(itr);
}
set.find(x)
在 set
中查找值为 x
的元素,并返回指向该元素的迭代器,若不存在,返回 set.end()
,时间复杂度为 O(logn)
set.lower_bound(x) / upper_bound(x)
用法与 find
类似,但查找的条件略有不同,时间复杂度 O(logn)
s.lower_bound(x)
表示查找 >= x
的元素中最小的一个,并返回指向该元素的迭代器
s.upper_bound(x)
表示查找 >x
的元素中最小的一个,并返回指向该元素的迭代器
总结一下,插入、删除、查找的时间复杂度都是O(logn)