跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

C++ map获取所有key列表 _ 遍历存入vector技巧【实战】

用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 m = {{1,"a"}, {3,"c"}, {2,"b"}}; std::vector keys; for (const auto& kv : m) { keys.push_back(kv.first); // ✅ 正确:kv.first 是 key }
这里
kv
类型是
const std::pair&
,
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 keys; keys.reserve(m.size()); // ⚠️ 强烈建议提前 reserve,避免多次 realloc std::transform(m.begin(), m.end(), std::back_inserter(keys), [](const auto& kv) { return kv.first; });
常见错误包括: 立即学习 “ C++免费学习笔记(深入) ”; C知道 CSDN推出的一款AI技术问答工具 下载 漏掉
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' has no member named 'keys'
如果你看到某处代码写了
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>
手动维护顺序。

相关文章