用for循环遍历map获取所有key到vector的最常用方式是范围for循环取pair.first;std::map无keys()成员函数,其key按升序排列,生成的vector也保持该顺序。

用 for 循环遍历 map 获取所有 key 到 vector
直接遍历 std::map 的键最常用、最直观的方式就是用范围 for 循环,每次取 pair 的 first 字段。注意别误写成 second(那是 value):
std::map<int std::string> m = {{1,"a"}, {3,"c"}, {2,"b"}};
std::vector<int> keys;
for (const auto& kv : m) {
keys.push_back(kv.first); // ✅ 正确:kv.first 是 key
}</int></int>
这里 kv 类型是 const std::pair<const int std::string>&</const>,first 是 const 引用,无需拷贝;如果 key 类型较大(比如 std::string),建议用 kv.first 而不是 kv.first.c_str() 或其他转换——除非你真需要 C 风格字符串。
用 std::transform + std::back_inserter 构建 key vector
想一行写出“提取所有 key”的逻辑,std::transform 是标准做法,但要注意迭代器类型和 lambda 返回值必须匹配:
std::vector<int> keys;
keys.reserve(m.size()); // ⚠️ 强烈建议提前 reserve,避免多次 realloc
std::transform(m.begin(), m.end(), std::back_inserter(keys),
[](const auto& kv) { return kv.first; });</int>
常见错误包括:
- 漏掉
keys.reserve(m.size())→ 小 map 不明显,大 map(万级+)性能下降明显 - lambda 写成
[&](...)→ 捕获方式无关紧要,但引用捕获对这个场景无意义,用空捕获[]更清晰 - 传
m.begin()和m.end()时误用cbegin()/cend()→ 实际效果一样,但begin()已是 const 迭代器(当m是 const 或在 const 成员函数里才需cbegin())
为什么不能直接用 map.keys()?
std::map 在 C++11–C++20 中**没有 keys() 成员函数**——这是 Python 的写法,C++ 标准库不提供。有人误以为 m.key_set() 或 m.get_keys() 存在,实际编译会报错:
error: 'class std::map<int std::string>' has no member named 'keys'</int>
如果你看到某处代码写了 m.keys(),那要么是自定义封装类,要么是用了第三方库(如 Boost.Bimap 或 folly::sorted_vector_map),不要当成标准行为去依赖。
map 的 key 顺序天然有序,vector 也保持该顺序
std::map 底层是红黑树,key 按 strict weak ordering 自动排序(默认升序)。所以无论用 for 循环还是 transform,生成的 std::vector 中 key 一定也是升序排列:
// m = {{3,"c"}, {1,"a"}, {2,"b"}} → 插入后内部已重排为 {1,2,3}
// keys vector 就是 {1, 2, 3},不是 {3,1,2}
这点容易被忽略:如果你本意是按插入顺序取 key,std::map 做不到——得换 std::unordered_map(但它的遍历顺序是未定义的),或者用 std::vector<:pair>></:pair> 手动维护顺序。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











