set基本知识

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 相同,只存放唯一元素,自动忽略重复元素;

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值