C++ multimap 多值映射容器详解与实用示例

今天 3650阅读

在 C++ 标准模板库(STL)中,multimap 是一种允许键重复的关联容器,适用于需要将多个值映射到同一键的场景。与 map 不同,multimap 不强制键的唯一性,因此非常适合处理一对多的数据关系。

multimap 内部通常基于红黑树实现,所有元素按键自动排序。其基本操作包括插入、查找、遍历和删除,均具有对数时间复杂度。下面通过一个实际例子展示其用法:

#include <iostream>
#include <map>
#include <string>

int main() {
    // 声明一个 multimap:键为字符串,值为整数
    std::multimap<std::string, int> scores;

    // 插入多个相同键的记录
    scores.insert({"Alice", 85});
    scores.insert({"Bob", 92});
    scores.insert({"Alice", 90});   // 允许重复键
    scores.insert({"Charlie", 78});
    scores.insert({"Alice", 88});

    // 遍历所有元素(按键排序)
    std::cout << "所有成绩记录:\n";
    for (const auto& pair : scores) {
        std::cout << pair.first << ": " << pair.second << "\n";
    }

    // 查找特定键的所有值
    std::string target = "Alice";
    auto range = scores.equal_range(target);
    std::cout << "\n" << target << " 的所有成绩:\n";
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << it->second << "\n";
    }

    return 0;
}

上述代码展示了如何插入重复键、遍历整个容器,以及使用 equal_range 获取某键对应的所有值。equal_range 返回一个迭代器对,分别指向该键值范围的起始和结束位置。

需要注意的是,multimap 不支持下标操作(如 scores["Alice"]),因为一个键可能对应多个值,无法确定返回哪一个。若需快速访问所有匹配项,应始终使用 equal_rangelower_boundupper_bound

此外,删除操作也需谨慎。若调用 erase(key),会删除所有匹配该键的元素;若只想删除部分,应结合迭代器精确控制。

总结来说,C++ 的 multimap 是处理“一对多”映射关系的强大工具。当你需要按排序键存储多个关联值时,它比手动维护 vectorlist 更高效、更安全。建议在涉及重复键且需有序访问的场景中优先考虑使用 multimap

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。