【std::map】判断是否存在某个键
本文介绍了在C++中判断std::map是否存在某个键的四种方法:1)使用find方法(最常用,可获取键值);2)count方法(简洁判断存在性);3)C++20新增的contains方法(最直观);4)慎用的operator[](会自动插入不存在的键)。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
在 C++ 的 std::map(或 std::unordered_map)中,判断是否存在某个键(key)有多种方法,常用的有以下几种:
1. 使用 find 方法(最常用)
std::map::find(key) 会返回一个迭代器:
- 若键存在,迭代器指向该键对应的键值对(
key-value)。 - 若键不存在,迭代器等于
map.end()。
示例代码:
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, int> myMap = {
{"apple", 5},
{"banana", 3},
{"orange", 7}
};
std::string key = "banana";
// 查找键
auto it = myMap.find(key);
if (it != myMap.end()) {
// 键存在
std::cout << "键 '" << key << "' 存在,值为:" << it->second << std::endl;
} else {
// 键不存在
std::cout << "键 '" << key << "' 不存在" << std::endl;
}
return 0;
}
2. 使用 count 方法(简洁判断)
std::map::count(key) 返回键在 map 中出现的次数(std::map 中键唯一,因此结果只能是 0 或 1):
- 返回
1:键存在。 - 返回
0:键不存在。
示例代码:
if (myMap.count(key) > 0) {
std::cout << "键 '" << key << "' 存在" << std::endl;
} else {
std::cout << "键 '" << key << "' 不存在" << std::endl;
}
特点:
比 find 更简洁,但只能判断存在性,无法直接获取对应的值(若需取值,仍需 find)。
3. C++20 新增的 contains 方法(最直观)
C++20 为 std::map 新增了 contains(key) 方法,直接返回 bool 值:
true:键存在。false:键不存在。
示例代码:
if (myMap.contains(key)) { // 需 C++20 及以上标准
std::cout << "键 '" << key << "' 存在" << std::endl;
} else {
std::cout << "键 '" << key << "' 不存在" << std::endl;
}
特点:
语义最清晰,但依赖 C++20 标准,需确保编译器支持(如 GCC 10+、Clang 12+、MSVC 2019+)。
4.总结推荐
- 若需 判断存在性并获取对应值:用
find方法(兼容性最好,适用于所有 C++ 标准)。 - 若仅需 判断存在性 且代码简洁:用
count方法(适用于 C++11 及以上)。 - 若使用 C++20 及以上 且追求可读性:用
contains方法(最直观)。
日常开发中,find 方法是最常用的选择,兼顾灵活性和兼容性。
5.慎用operator[]
在 std::map 中,使用 operator[] 查找不存在的键 时,会发生两个关键行为:
- 自动在 map 中 插入一个新的键值对(键为你传入的不存在的键,如
"hh"); - 新插入的键对应的 值是该类型的默认构造值(即
value_type的默认构造结果)。
针对你的场景(map<QString, QString> m)
当执行 QString value = m["hh"] 且 "hh" 不存在时:
map会自动插入键为"hh"的新元素;- 新元素的值是
QString的 默认构造对象——对于QString,默认构造的结果是 空字符串("",长度为 0 的字符串)。
因此,最终 value 的值是 空字符串。
补充说明(避免踩坑)
-
operator[]的“插入特性”:
这是std::map::operator[]的核心特性——它不仅是“查找”,更是“查找或插入”。如果只是想判断键是否存在,不建议用operator[](会误插入无效键值对),推荐用find()或 C++20 的contains():// 安全判断键是否存在(不插入新元素) if (m.find("hh") != m.end()) { // 存在,获取值 QString value = m["hh"]; } else { // 不存在,处理逻辑 } // C++20 更简洁的判断 if (m.contains("hh")) { // 存在 } -
其他类型的默认值:
若 map 的值类型不是QString,默认值由类型本身决定:- 基础类型(
int、double):默认构造为 0(int是 0,double是 0.0); - 自定义类型:必须有默认构造函数(否则编译报错),默认值是默认构造的对象。
- 基础类型(
-
at()成员函数的区别:
若想“查找不存在的键时直接报错(不插入)”,可用m.at("hh")——当键不存在时,会抛出std::out_of_range异常,避免误插入。
总结
- 你的场景中,
m["hh"]会插入键"hh",返回的value是 空字符串(""); - 慎用
operator[]做“纯查找”,优先用find()/contains()判断存在性。
更多推荐


所有评论(0)