如何访问std::multimap中相同键的元素?能否用范围for循环遍历?
访问std::multimap中相同键的元素
要访问std::multimap里所有共享同一键的元素,最直接高效的方式是用**equal_range()**方法,它会返回一个迭代器对(std::pair),分别指向该键的第一个元素,以及最后一个匹配元素的下一个位置。利用这个范围,你可以轻松遍历所有目标元素,包括用范围for循环(需C++20或简单包装)。
核心方法示例
先构建一个带重复键的std::multimap:
#include <iostream> #include <map> #include <string> int main() { std::multimap<int, std::string> mm; mm.insert({1, "apple"}); mm.insert({1, "banana"}); mm.insert({2, "cherry"}); mm.insert({1, "date"});
1. 迭代器循环遍历(兼容所有C++版本)
调用equal_range()获取目标键的范围,再用普通迭代器循环遍历:
// 获取键为1的元素范围 auto range = mm.equal_range(1); // 遍历从range.first到range.second的所有元素 for (auto it = range.first; it != range.second; ++it) { std::cout << "键: " << it->first << ", 值: " << it->second << '\n'; }
C++17及以上可使用结构化绑定简化写法:
auto [first, last] = mm.equal_range(1); for (auto it = first; it != last; ++it) { std::cout << "键: " << it->first << ", 值: " << it->second << '\n'; }
2. 范围for循环遍历(C++20+)
C++20引入的std::ranges::subrange可将迭代器范围包装为支持范围for的对象:
#include <ranges> auto [first, last] = mm.equal_range(1); for (const auto& pair : std::ranges::subrange(first, last)) { std::cout << "键: " << pair.first << ", 值: " << pair.second << '\n'; }
替代方案:手动用lower_bound和upper_bound
equal_range()本质是同时调用lower_bound()(找第一个不小于目标键的元素)和upper_bound()(找第一个大于目标键的元素),你也可以手动组合这两个方法构建范围:
auto first = mm.lower_bound(1); auto last = mm.upper_bound(1); for (auto it = first; it != last; ++it) { std::cout << "键: " << it->first << ", 值: " << it->second << '\n'; }
注意事项
equal_range()时间复杂度为O(log n),比先调用count()(O(n))再遍历更高效,因为count()需要先遍历统计元素数量,而equal_range()直接定位范围。- 无法直接对
std::multimap的特定键使用原生范围for,但通过上述迭代器范围的包装,完全可以实现类似的简洁遍历。
内容的提问来源于stack exchange,提问作者Isak True
相关产品推荐
相关产品推荐

