C++ multimap 多值映射容器详解与实用示例
在 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_range、lower_bound 或 upper_bound。
此外,删除操作也需谨慎。若调用 erase(key),会删除所有匹配该键的元素;若只想删除部分,应结合迭代器精确控制。
总结来说,C++ 的 multimap 是处理“一对多”映射关系的强大工具。当你需要按排序键存储多个关联值时,它比手动维护 vector 或 list 更高效、更安全。建议在涉及重复键且需有序访问的场景中优先考虑使用 multimap。
文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

