set
1.set 的定义与常用函数
1)set 的定义
-
set 是一个用来存储同类型唯一元素的容器,并按照一定规则进行排序,set 中的元素是默认按照升序进行排列的;
template <class Key, class Compare = less<Key>, class Allocator = allocator<Key>>
class set;
-
Key 表示存储在 set 里面元素的类型;
-
Compare 表示函数比较类型,默认为 less<>(升序排列),可以改为 greater<> (降序排列);
-
Allocator 表示函数用于分配器的类型,默认为 allocator ,可以缺省;
注意:set 中的元素是唯一的,即不允许重复元素存在,故此向其中插入重复元素时 set 会自动忽略该元素;
2)set 的常用函数
1)insert(x) 向 set 中插入x元素,时间复杂度为 O(logN);
2)eraset(x) 在 set 中删除x元素,时间复杂度为 O(logN);
3)find(x) 查找 set 中的x元素,如果不存在就返回end迭代器,时间复杂度为 O(logN);
4)lower_bound(x) 返回 set 中第一个不小于x元素的迭代器,时间复杂度为 O(logN);
5)lower_bound(x) 返回 set 中第一个大于x元素的迭代器,时间复杂度为 O(logN);
6)size(x) 返回 set 中元素的数量,时间复杂度为 O(1);
7)empty(x) 检查 set 是否为空,时间复杂度为 O(1);
8)clear(x) 清空集合,时间复杂度为 O(1);
9)begin() end() rbegin() rend() 不再赘述;
3)自定义比较函数
法一:
直接使用 greater<> 改为逆序;
set <int,greater<int>> Myset;
法二:
使用 struct 重载运算符 () ;
#include <iostream>
#include <set>
using namespace std;
struct cmp{
bool operator()(const int& a,const int& b){
return a > b;
}
};
int main()
{
set<int,cmp> Myset;
Myset.insert(1);
Myset.insert(7);
Myset.insert(5);
Myset.insert(6);
Myset.insert(5);
for(int num : Myset)cout << num << ' ';
return 0;
}
2.multiset 的定义与常用函数
1)multiset 的定义
-
multiset 与 set 的区别为,set 只能存储唯一元素,而 multiset 则可以存储重复元素;
2)multiset 的常用函数
1)insert(x) 向 set 中插入x元素,时间复杂度为 O(logN);
2)eraset(x) 在 set 中删除x元素,时间复杂度为 O(logN);
注意:由于 multiset 可以存储重复元素,直接使用 erase(x) 会将 multiset 里面的所有此元素删除,如若只删除1个x则需进行如下操作↓
multiset.erase(multiset.find(x));
3)find(x) 查找 set 中的x元素,如果不存在就返回end迭代器,时间复杂度为 O(logN);
4)lower_bound(x) 返回 set 中第一个不小于x元素的迭代器,时间复杂度为 O(logN);
5)lower_bound(x) 返回 set 中第一个大于x元素的迭代器,时间复杂度为 O(logN);
6)size(x) 返回 set 中元素的数量,时间复杂度为 O(1);
7)empty(x) 检查 set 是否为空,时间复杂度为 O(1);
8)clear(x) 清空集合,时间复杂度为 O(1);
9)begin() end() rbegin() rend() 不再赘述;
3.*unordered_set 简述
-
unordered_set 底层是由哈希表实现的,故此,其元素的插入、删除和查找的平均时间复杂度为O(1),但最坏时间复杂度都为O(n)!;
-
unordered_set 与 set 相同,只存放唯一元素,自动忽略重复元素;