LeetCode C++ 常用数据结构
C++ STL
std::queue
- 头文件:
#include <queue>
1 | |
std::deque (double-ended queue, 双端队列)
- 头文件:
#include <deque>
1 | |
std::deque的底层内存存储不连续, 使用dq[i]随机访问需要通过中控数组进行 二次指针解引用, 开销比std::vector随机访问要略大. 但是仍然是 O(1).
std::priority_queue 优先队列,使用heap实现
- 头文件:
#include <queue>
1 | |
- 如果要自定义比较器:
1 | |
自定义比较器 Compare(a, b) 的意思是 a的优先级是否低于b (优先级最高的元素在堆顶)
因此比较器写 a<b (类似std::less) 代表越大元素优先级越高 -> 大顶堆, 同理 a>b 代表小顶堆
std::set 集合,集合中元素有序,不会有重复元素
- 头文件:
#include <set> - 添加:
.insert()- 如果添加的元素是结构体,必须重载
operator<
- 如果添加的元素是结构体,必须重载
- 删除:
.erase() - 判断元素是否存在:
.count() - 遍历:
for (auto& p: s)或者for (auto it = s.begin(); it != s.end(); ++it) { *it; }
1 | |
std::unordered_set 无序集合,也保证不会有重复元素
- 头文件:
#include <unordered_set> - 跟
std::set的使用方法相同,区别在于std::set用红黑树,std::unordered_set用哈希表
std::unordered_map 哈希表,一个key只能对应一个value不会重复
头文件:
#include <unordered_map>添加元素: 下标添加或
.insert( {key, value} ).如果添加的是重复的key, 则使用下标会修改value,使用insert不会修改value.
查找元素用[]下标,
.at()或者.find:if (m.find(key) != m.end()) { ... }检查元素是否存在可以使用
m.count(key)或m.find(key) != m.end()删除:
.erase( key )遍历:
for (auto iter = m.begin(); iter != m.end(); iter++) { }key =
iter->first, value =iter->second.
1 | |
std::unordered_multimap 也是哈希表,但允许重复的key
头文件:
#include <unordered_map>插入元素: 不能使用operator[], 只能使用
.insert查找指定key的一个元素:
.find( key )查找key的所有元素:
.equal_range( key )auto range = m.equal_range (key)for (auto it = range.first; it != range.second; ++it) { }
1 | |
LeetCode C++ 常用数据结构
https://www.billhu.us/2024/058_leetcode_basics/