第二节 · 一一对应 · 关联容器

顺序容器按照元素添加的顺序存储数据。但有时候,我们需要根据(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 的常用操作


自定义排序

mapset 默认按升序排序。可以通过比较函数自定义:


实际应用:单词计数


如何选择关联容器

  • 需要键值对:mapunordered_map

  • 只需要集合:setunordered_set

  • 需要按顺序遍历:mapset

  • 只需要快速查找:unordered_mapunordered_set

  • 允许重复:multimapmultiset


习题

  • 使用 map 实现一个简单的电话簿程序。

  • 使用 set 找出两个数组的交集和并集。

  • 比较 mapunordered_map 在大量数据下的查找性能。

Last updated