第二节 · 一一对应 · 关联容器
顺序容器按照元素添加的顺序存储数据。但有时候,我们需要根据键(key)来快速查找数据,这就是关联容器的用武之地。
关联容器就像一本字典——你通过单词(键)快速找到释义(值),而不需要从头翻到尾。
关联容器概览
容器
说明
特点
map
键值对映射
键有序,键唯一
set
集合
元素有序,元素唯一
multimap
多重映射
键有序,键可重复
multiset
多重集合
元素有序,元素可重复
unordered_map
哈希映射
无序,查找更快
unordered_set
哈希集合
无序,查找更快
map:键值对映射
map 存储键值对,每个键唯一,按键排序:
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
map<string, int> scores;
// 插入元素
scores["Alice"] = 95;
scores["Bob"] = 87;
scores.insert({"Carol", 92});
scores.insert(make_pair("David", 78));
// 访问元素
cout << scores["Alice"] << endl; // 95
cout << scores.at("Bob") << endl; // 87
// 注意:[] 访问不存在的键会创建该键!
cout << scores["Unknown"] << endl; // 0(新创建的)
// 安全地检查键是否存在
if (scores.find("Eve") != scores.end())
cout << "找到了" << endl;
else
cout << "没找到" << endl;
// 或使用 count
if (scores.count("Alice") > 0)
cout << "Alice 存在" << endl;
// 遍历(按键排序)
for (const auto& pair : scores)
{
cout << pair.first << ": " << pair.second << endl;
}
// C++17 结构化绑定
for (const auto& [name, score] : scores)
{
cout << name << ": " << score << endl;
}
return 0;
}set:集合
set 存储唯一元素,自动排序:
multimap 和 multiset
允许重复键或重复元素:
unordered_map 和 unordered_set
使用哈希表实现,查找更快(平均 O(1)),但不保持顺序:
map 的常用操作
自定义排序
map 和 set 默认按升序排序。可以通过比较函数自定义:
实际应用:单词计数
如何选择关联容器
需要键值对:
map、unordered_map只需要集合:
set、unordered_set需要按顺序遍历:
map、set只需要快速查找:
unordered_map、unordered_set允许重复:
multimap、multiset
习题
使用
map实现一个简单的电话簿程序。使用
set找出两个数组的交集和并集。比较
map和unordered_map在大量数据下的查找性能。
Last updated