C++ multimap如何使用 允许重复键的关联容器详解

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

C++ multimap如何使用 允许重复键的关联容器详解

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

C++ multimap如何使用 允许重复键的关联容器详解

这篇文章就来聊聊怎么用multimap,包括插入、查找、遍历这些常用操作,以及一些你可能会忽略的小细节。


插入元素:多种方式可以选

multimap支持多种插入方式,最常见的是使用insert()函数。你可以插入一个完整的键值对,也可以使用make_pair简化写法。

立即学习C++免费学习笔记(深入)”;

C++ multimap如何使用 允许重复键的关联容器详解

例如:

std::multimap<int, std::string> mm; mm.insert({1, "apple"}); mm.insert(std::make_pair(1, "orange"));

上面这段代码插入了两个键为1的元素。注意,multimap不会覆盖已有键,而是保留所有键值对

C++ multimap如何使用 允许重复键的关联容器详解

如果你想插入多个元素,可以用范围插入:

std::vector<std::pair<int, std::string>> vec = {{2, "banana"}, {2, "grape"}}; mm.insert(vec.begin(), vec.end());

这样就可以批量添加内容了。


查找与访问:用equal_range是关键

因为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。

遍历元素:和map差不多,但顺序默认按键排序

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复杂一点,但只要记住“允许多个相同键”这个核心点,在操作上稍作调整就可以了。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享