起因就是在刷苯环的蓝桥杯题单,在写到《木材仓库》(https://www.luogu.com.cn/problem/P5250)一题时发现自己对于set的掌握不能丝滑地解决。为了更暴力地运用STL健全自己的知识体系,我对set的函数们进行了学习。
1.insert函数
我们都知道insert函数本身的作用是插入某个值,可是我们也知道,set要求数据有唯一性,那么如果某个数据已经存在原集合中,再次执行insert函数会插入失败。事实上,对于插入这个操作,insert函数会有一个pair类型的返回值:
std::pair
第一个项很容易看懂,是插入元素的迭代器。那么如果插入的元素已经出现,这个迭代器就会返回等效元素在集合中的迭代器(就是位置)。而第二个bool型的值则表示插入操作成功执行与否。所以,如果需要判断一个新的数是否已经出现在原集合中,直接insert也可以知道结果。
同样,更省心的emplace(C++11开始)也会返回相同的返回值。
2.erase函数
有insert的拓展就肯定会有erase的拓展。是的,擦除元素同样也会得到返回值。
如果传入指定位置的参数,即:
erase(iterator pos)
那么,返回结果就是被删除元素之后元素的迭代器(C++11开始)。
如果传入指定键值的参数,即:
erase(const key_type& key)
那么,返回结果就是被删除元素的个数(其实由于set的元素唯一性,这个结果只会是0或1)。
3.contains函数(C++20开始)
比起find函数更直观,返回值是一个bool型,表示是否找到该键值的元素。
没啥拓展,毕竟平时都是最高不超过C++17,所以有点冷门。
4.equal_range函数
我们知道lower_bound和upper_bound函数(本质二分查找),那么,equal_range则是包含了lower和upper的一个函数。
使用方法:equal_range(key)
将会返回一个pair型值,包含了lower_bound(第一个不小于key的元素迭代器)和upper_bound(第一个大于key的元素迭代器)的值。也就是说,我们可以利用这个函数确定一个区间。

Comments NOTHING