C++如何遍历一个map?(代码示例)

C++中遍历std::map推荐使用基于范围的for循环,元素为std::pair类型,键用.first、值用.second访问;需删除元素时应使用迭代器配合erase()返回值,且map遍历结果按键升序排列。

遍历 C++ 中的 std::map 有多种方式,最常用的是基于范围的 for 循环(C++11 起),也支持传统迭代器和 while 循环。关键点是:map 的每个元素是 std::pair 类型,访问键用 .first,值用 .second

用范围 for 循环(推荐)

简洁、安全、可读性高,适合大多数场景。

#include 
#include 
#include 

int main() {
    std::map m = {{1, "apple"}, {3, "banana"}, {2, "cherry"}};

    // 自动推导类型:const std::pair&
    for (const auto& kv : m) {
        std::cout << "key=" << kv.first << ", value=" << kv.second << '\n';
    }
    // 输出按 key 升序:key=1, key=2, key=3(map 有序)

    return 0;
}

用迭代器遍历(兼容旧标准)

显式使用 begin()end(),适用于需控制遍历过程(如中途 break/erase)的场景。

for (auto it = m.begin(); it != m.end(); ++it) {
    std::cout << "key=" << it->first << ", value=" << it->second << '\n';
}

// 或用 const_iterator(更严谨,尤其在 const map 上)
for (std::map::const_iterator it = m.cbegin();
     it != m.cend(); ++it) {
    std::cout << it->first << " → " << it->second << '\n';
}

只遍历 key 或只遍历 value

如果只需要键或值,可用结构化绑定(C++17)或单独提取。

  • C++17 结构化绑定(清晰直观):
for (const auto& [k, v] : m) {
    std::cout << "key: " << k << '\n';  // 只用 k
    // std::cout << "value: " << v << '\n';
}
  • 传统方式(遍历中只取 it->firstit->second

遍历时安全删除元素

直接用范围 for 删除会失效迭代器。必须用迭代器 + erase() 返回值(C++11 起)。

// 删除所有 value == "apple" 的项
for (auto it = m.begin(); it != m.end(); ) {
    if (it->second == "apple") {
        it = m.erase(it); // erase 返回下一个有效迭代器
    } else {
        ++it;
    }
}

基本上就这些。选范围 for 最省心;需要删元素时务必用迭代器配合 erase 返回值;注意 map 天然按键升序排列,遍历结果总是有序的。