C++竞赛STL 哈希表与队列总结

哈希表 unordered_set 和 unordered_map

特性 unordered_set unordered_map
存储内容 仅存储键(key) 存储键值对(key-value pairs)
元素类型 单个值(如 int、string 等) 键值对(如 pair<const Key, Value>)
访问方式 通过键直接访问 通过键访问对应的值
重复元素 不允许重复键 不允许重复键

unordered_setunordered_map
单个值键值对
无序存储无序存储
不允许重复键不允许重复键
可用于去重
通过key快速查找value
统计key的出现次数
相同
a.erase(key)//删除key位置元素或key对应键值对
a.find()//查找 返回该数的位置
if (a.find(10) != a.end()) {
    cout << "Found 10 in set!" << endl;
}
a.end()//最后一个数的下一个数
不同
unordered_set<int> s;
s.insert(10);  // 插入元素 10

unordered_map<string, int> m;
m["apple"] = 5; 
m.insert({"apple",5});
// 插入键值对 ("apple", 5)
unordered_set与unordered_map实战 :洛谷 不重复数字

队列与优先队列 queue priority_queue

queue

队列特点:先进先出

a.front()	//返回队首元素
a.back()	//返回队尾元素 
a.push(x)	//尾部增添一个元素x 即入队
a.pop()	//删除第一个元素 即出队 
a.size()	//返回元素个数,返回值类型unsigned int 
a.empty()  //判断是否为空 ,返回类型类型为bool 为空返回true 
priority_queue

优先队列基于堆实现,默认底层容器为vector,也可以是deque,与队列区别在于优先级,在做题中一般用来实现大根堆或小根堆
操作

a.top()//访问优先级最高的元素(即堆顶),基于堆实现的快速队列不能使用front和back
a.push(x)	//尾部增添一个元素x 即入队
a.pop()	//删除第一个元素 即出队 
a.size()	//返回元素个数,返回值类型unsigned int 
a.empty()	//判断是否为空 ,返回类型类型为bool 为空返回true 
插入规则的定义

int型

priority_queue<type1>, vector<type2>, cmp > a;;
//type1和type2均为优先队列中要存储的数据类型,两者应当一致,cmp为自定义排序规则
priority_queue<int> a; // 默认大根堆, 即每次取出的元素是队列中的最大值
priority_queue<int, vector<int>, less<int> > a; // 大根堆,同上
priority_queue<int, vector<int>, greater<int> >a; // 小根堆, 每次取出的元素是队列中的最小值

pair<int,int>

默认规则:按first成员比较,若相等则比较second,等同使用std::less<pair<int, int>>(大根堆堆)。
使用自定义规则:
operator()返回true时,表示第一个参数的优先级低于第二个参数。
struct cmp {
    bool operator()(const pair<int, int>& a, const pair<int, int>& b) {
        return a.second < b.second; // 大根堆,按second降序,其实就是和sort的定义规则反过来,具体原理可以去了解堆
    }
};
priority_queue<pair<int, int>, vector<pair<int, int>>,cmp> pq;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值