我用过的STL总结
哈希表 unordered_set 和 unordered_map
特性 unordered_set unordered_map
存储内容 仅存储键(key) 存储键值对(key-value pairs)
元素类型 单个值(如 int、string 等) 键值对(如 pair<const Key, Value>)
访问方式 通过键直接访问 通过键访问对应的值
重复元素 不允许重复键 不允许重复键
unordered_set | unordered_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;