map
新旧两种方式遍历map
unordered_map<char, int> mp;
for(const auto &mypair : mp) {
cout << mypair.first << " " << mypair.second << endl;
}
或者
for(const auto &[name, age] : mp) {
cout << name << ": " << age << endl;
}
unordered_map<char, int> mp;
for(unordered_map<char, int>::iterator it = mp.begin(); it != mp.end(); ++it) {
cout << "Key: " << it->first << ", Value: " << it->second << endl;
}
count与find函数
count()
函数返回的是指定key的数量(注意不是返回value),也就是说,在unordered_map里只能返回0或1,而在multi_map里可以返回其它数值
find()
函数用于判断指定key是否存在,返回一个指向该元素的迭代器,如果未找到,则返回指向 map::end()
的迭代器
set
使用vector构造set
vector<int> nums = {1, 2, 2};
set<int> st(nums.begin(), nums.end()); //多用于去重,且会自动升序排序
vector<int> v(st.begin(), st.end()); //去完重再返回vector,便于用传统for循环
priority_queue
创建优先队列
priority_queue
默认是最大堆(即优先级最高的元素在顶部):
priority_queue<int> pq; // 创建一个默认的最大堆
可以使用 std::greater
作为比较器来创建最小堆:
priority_queue<int, vector<int>, greater<int>> minHeap;
ps:vector<int>
是 priority_queue
的第二个模板参数,指定了底层容器的类型。 priority_queue
需要一个底层容器来存储元素,其他可能的选项还包括 deque
或 list
,但 vector
通常是最常用的选择,因为它在内存使用和随机访问性能上表现较好。
如果要创建的优先队列元素比较特殊,比如链表节点指针,就要自定义比较器了👇
自定义比较器
struct Comparator {
bool operator()(ListNode *a,ListNode *b) {
return a->val > b->val; //代表小根堆,因为如果返回true,就表示左侧元素的优先级低于右侧元素(有点反直觉)
}
};
priority_queue<ListNode*, vector<ListNode* >, Comparator> queue;
函数原型
pq.push(10); //插入元素
pq.top(); //访问顶部元素
pq.pop(); //删除顶部元素
pq.empty(); //检查优先队列是否为空
pq.size(); //获取优先队列中元素的数量
functions
新旧两种sort函数
string str = "bac";
ranges::sort(str); //按字典顺序排序,str = "abc"
ranges::sort(str, greater()); //降序
string str = "bac";
sort(str.begin(), str.end()); //同上,如果是int,则按升序排列
ranges
ranges::max(v); //v是vector数组
ranges::sort(str);