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