You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:50:14