在c++++中,std::multimap用于存储多个相同键的关联容器。它允许插入多个相同键值,使用insert()函数可添加单个或批量元素;查找时需用equal_range()获取指定键的所有元素;遍历默认按键升序排列,也可自定义排序规则;删除时可用erase()删除特定位置或所有相同键元素,需注意迭代器失效问题。

在C++中,如果你需要一个能存储多个相同键的关联容器,std::multimap就是你要找的那个。它和std::map类似,但最大的区别在于:允许重复的键值。也就是说,你可以有多个相同的键对应不同的值。

这篇文章就来聊聊怎么用multimap,包括插入、查找、遍历这些常用操作,以及一些你可能会忽略的小细节。
multimap支持多种插入方式,最常见的是使用insert()函数。你可以插入一个完整的键值对,也可以使用make_pair简化写法。
立即学习“C++免费学习笔记(深入)”;

例如:
std::multimap<int, std::string> mm;
mm.insert({1, "apple"});
mm.insert(std::make_pair(1, "orange"));上面这段代码插入了两个键为1的元素。注意,multimap不会覆盖已有键,而是保留所有键值对。

如果你想插入多个元素,可以用范围插入:
std::vector<std::pair<int, std::string>> vec = {{2, "banana"}, {2, "grape"}};
mm.insert(vec.begin(), vec.end());这样就可以批量添加内容了。
因为multimap允许重复键,所以不能像map那样直接通过[]或者find()获取唯一的值。这时候需要用到equal_range()函数,它会返回一个pair,表示该键对应的所有元素的范围。
举个例子:
auto range = mm.equal_range(1);
for (auto it = range.first; it != range.second; ++it) {
std::cout << it->second << std::endl;
}这样就能遍历所有键为1的元素了。
另外需要注意几点:
find()虽然也能找到某个键的第一个元素,但它只返回一个迭代器,无法获取全部。count()函数判断数量是否大于0。multimap默认是按键升序排列的(底层实现是红黑树),所以遍历的时候也是按照键的顺序输出。
遍历方法如下:
for (const auto& pair : mm) {
std::cout << pair.first << ": " << pair.second << std::endl;
}如果你希望自定义排序规则,可以在声明时传入比较函数对象,比如降序:
std::multimap<int, std::string, std::greater<>> mm;
这样键就会从大到小排列。
删除multimap中的元素可以用erase()函数。如果只是删除一个特定位置的元素,可以直接传入迭代器:
auto it = mm.find(1);
if (it != mm.end()) {
mm.erase(it);
}但如果你想删除所有键为1的元素,建议用下面这种更稳妥的方式:
mm.erase(1);
这会一次性删除所有键等于1的元素。
需要注意的是,删除之后原来的迭代器可能失效,尤其是使用equal_range后,不要继续用之前的迭代器访问。
基本上就这些。multimap虽然比map复杂一点,但只要记住“允许多个相同键”这个核心点,在操作上稍作调整就可以了。
以上就是C++ multimap如何使用 允许重复键的关联容器详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号