csp信奥赛C++标准模板库STL(7):unordered_map的使用详解
一、unordered_map 概述
unordered_map是 C++ STL 中的关联容器,基于哈希表实现,提供 O(1) 平均时间复杂度的查找、插入和删除操作。
1.1 基本特性
- 底层结构:哈希表(hash table)
- 时间复杂度:
- 平均情况:O(1)
- 最坏情况:O(n)
- 元素顺序:无序(元素顺序与插入顺序无关)
- 头文件:
#include <unordered_map> - C++版本:C++11 及以上
二、基本用法
2.1 声明和初始化
#include<iostream>#include<unordered_map>#include<string>usingnamespacestd;intmain(){// 1. 空unordered_mapunordered_map<int,string>mp1;// 2. 初始化列表unordered_map<string,int>mp2={{"apple",5},{"banana",3},{"orange",7}};// 3. 复制构造unordered_map<string,int>mp3(mp2);return0;}2.2 常用操作
// 插入元素mp["apple"]=5;// 使用下标运算符mp.insert({"banana",3});// 使用insert方法mp.emplace("orange",7);// 原地构造,效率更高// 访问元素cout<<mp["apple"]<<endl;// 如果不存在会创建cout<<mp.at("banana")<<endl;// 如果不存在抛出异常// 查找元素autoit=mp.find("apple");if(it!=mp.end()){cout<<"Found: "<<it->first<<" -> "<<it->second<<endl;}// 删除元素mp.erase("apple");// 按键删除mp.erase(it);// 按迭代器删除// 遍历元素for(auto&pair:mp){cout<<pair.first<<": "<<pair.second<<endl;}// 大小相关cout<<"Size: "<<mp.size()<<endl;cout<<"Empty: "<<mp.empty()<<endl;mp.clear();// 清空三、竞赛常用技巧
3.1 统计频率(最常见的应用)
// 统计数组中每个元素的出现次数vector<int>nums={1,2,3,2,1,3,3,3};unordered_map<int,int>freq;for(intnum:nums){freq[num]++;}// 输出频率for(auto&p:freq){cout<<p.first<<" appears "<<p.second<<" times"<<endl;}3.2 两数之和问题
// 在数组中找到两个数,使它们的和等于目标值vector<int>twoSum(vector<int>&nums,inttarget){unordered_map<int,int>hash;// 值 -> 索引for(inti=0;i<nums.size();i++){intcomplement=target-nums[i];if(hash.find(complement)!=hash.end()){return{hash[complement],i};}hash[nums[i]]=i;}return{};}3.3 字符串模式匹配
// 判断两个字符串是否为字母异位词boolisAnagram(string s,string t){if(s.length()!=t.length())returnfalse;unordered_map<char,int>count;for(charc:s)count[c]++;for(charc:t){if(--count[c]<0)returnfalse;}returntrue;}四、与map的对比
| 特性 | unordered_map | map |
|---|---|---|
| 底层实现 | 哈希表 | 红黑树 |
| 时间复杂度 | 平均O(1),最差O(n) | O(log n) |
| 元素顺序 | 无序 | 按键排序 |
| 内存使用 | 通常较少 | 通常较多 |
| 适用场景 | 频繁查找,不关心顺序 | 需要有序遍历 |
选择建议:
- 如果只需要快速查找,使用
unordered_map - 如果需要有序遍历,使用
map - 如果有大量数据且查找频繁,优先考虑
unordered_map
总结
在CSP信奥赛中,unordered_map是最重要的数据结构之一,尤其适合:
- 需要快速查找的场景- O(1)的平均时间复杂度
- 统计频率- 计数、频率统计问题
- 缓存中间结果- 动态规划中的记忆化搜索
- 去重和存在性判断- 配合
unordered_set使用
掌握好unordered_map的使用,能在竞赛中解决大量查找和统计类问题,是C++选手的必备技能。
各种学习资料,助力大家一站式学习和提升!!!
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}- 一、CSP信奥赛C++通关学习视频课:
- C++语法基础
- C++语法进阶
- C++算法
- C++数据结构
- CSP信奥赛数学
- CSP信奥赛STL
- 二、CSP信奥赛C++竞赛拿奖视频课:
- 信奥赛csp-j初赛高频考点解析
- CSP信奥赛C++复赛集训课(12大高频考点专题集训)
- 三、考级、竞赛刷题题单及题解:
- GESP C++考级真题题解
- CSP信奥赛C++初赛及复赛高频考点真题解析
- CSP信奥赛C++一等奖通关刷题题单及题解
详细内容:
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转
2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转
3、csp信奥赛冲刺一等奖有效刷题题解:
CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
- 2025 csp-j 复赛真题及答案解析(最新更新)
- 2025 csp-x(山东) 复赛真题及答案解析(最新更新)
- 2025 csp-x(河南) 复赛真题及答案解析(最新更新)
- 2025 csp-x(辽宁) 复赛真题及答案解析(最新更新)
- 2025 csp-x(江西) 复赛真题及答案解析(最新更新)
- 2025 csp-x(广西) 复赛真题及答案解析(最新更新)
- 2020 ~ 2024 csp 复赛真题题单及题解
- 2019 ~ 2022 csp-j 初赛高频考点真题分类解析
- 2021 ~ 2024 csp-s 初赛高频考点解析
- 2023 ~ 2024 csp-x (山东)初赛真题及答案解析
- 2024 csp-j 初赛真题及答案解析
- 2025 csp-j 初赛真题及答案解析(最新更新)
- 2025 csp-s 初赛真题及答案解析(最新更新)
- 2025 csp-x (山东)初赛真题及答案解析(最新更新)
- 2025 csp-x (江西)初赛真题及答案解析(最新更新)
- 2025 csp-x (辽宁)初赛真题及答案解析(最新更新)
CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
- 129 道刷题练习和详细题解,涉及:模拟算法、数学思维、二分算法、 前缀和、差分、深搜、广搜、DP专题、 树和图
4、GESP C++考级真题题解:
GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转
GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转
· 文末祝福 ·
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}