遍历map的key最常用方式是for(const auto& kv : m)访问kv.first;需用const引用避免拷贝,key不可修改;可提取key到vector等容器进行后续操作;传统迭代器it->first也可用;find和[]非遍历方法,自定义key须支持

用 for 循环 + auto 遍历 map 的 key
最常用、最直观的方式是直接遍历 map,每个迭代器元素本身就是 std::pair 类型,.first 就是 key:
std::mapm = {{1, "a"}, {2, "b"}, {3, "c"}}; for (const auto& kv : m) { std::cout << kv.first << std::endl; // 输出 key:1 2 3 }
注意必须用 const auto&(或 auto&),否则会触发 pair 拷贝,虽不报错但低效;kv.first 是只读的,因为 map 的 key 是 const。
单独提取所有 key 到 vector 或其他容器
如果后续要对 key 做排序、去重(虽然 map 本身已有序)、查找等操作,可以先把 key 拷出来:
std::vectorkeys; keys.reserve(m.size()); for (const auto& kv : m) { keys.push_back(kv.first); }
常见错误:写成 keys.push_back(m.key()) —— map 没有 key() 成员函数;也别误用 m.begin()->key,iterator 解引用得到的是 pair,不是自定义结构体。
立即学习“C++免费学习笔记(深入)”;
用传统迭代器显式访问 key 和 value
老式写法仍有效,尤其在需要控制遍历起止位置(如部分遍历)或兼容旧代码时:
-
m.begin()返回std::map,解引用后是::iterator std::pair& -
it->first是key,it->second是value - 不要写
(*it).first,虽合法但不如it->first清晰
for (auto it = m.begin(); it != m.end(); ++it) {
std::cout << it->first << ": " << it->second << std::endl;
}
map::find() 和 operator[] 不是遍历方法,别混用
这两个是单次查找接口,不能用来“获取所有 key”:
-
m.find(k)返回指向匹配pair的迭代器,没找到返回m.end() -
m[k]会**默认构造并插入**不存在的 key,副作用极大,遍历时绝对不能用 - 想判断 key 是否存在,用
m.count(k) == 1或m.find(k) != m.end(),不是遍历手段
真正容易被忽略的是:map 的 key 类型必须支持 (默认按升序排列),如果你用自定义类型作 key 却没定义 operator 或提供比较器,编译会直接失败——这时候连遍历都写不出来。










