推荐用 find != end() 判断 key 是否存在,因 count 底层调用 find 且多一次比较;C++20 起优先用 contains,语义清晰、安全简洁;multimap 中 count 返回频次,非仅存在性判断。
count 判断 key 是否存在,性能不如 find
map::count 返回 0 或 1,看似直观,但底层仍需定位节点——它内部调用的是等价于 find 的查找逻辑,再判断是否到达 end()。对 std::map(红黑树)而言,count 和 find 都是 O(log n),但 count 多一次迭代器比较,且无法复用结果。
count 可读性略高,但无实质优势find 一次查找、两次使用,避免重复遍历unordered_map 同理:两者复杂度相同,但 find 返回的迭代器可直接解引用find 返回迭代器,必须和 end() 比较才安全不能直接写 if (m.find(key)) —— 迭代器转布尔永远为 true(除非是空指针,但 map::iterator 不是原始指针)。正确写法是显式比对:
auto it = m.find(key);
if (it != m.end()) {
// key 存在,it->second 即值
}
if (m.find(key)) 会导致逻辑永远成立,编译不报错但行为错误if (auto it = m.find(key); it != m.end()) { ... }
end() 是开区间边界,不可解引用count
在 multimap 中语义完全不同std::multimap 允许重复 key,此时 count 返回匹配 key 的元素个数(可能 >1),而 find 只返回第一个匹配项的迭代器。若你在用 multimap 却按 map 的习惯只看 count > 0,逻辑上没错,但掩盖了“多值”这一关键差异。
multimap,count 是必要操作(比如统计频次)find != end() 依然更高效,尤其当容器很大、key 出现在开头时count == 1 来断言唯一性——那是设计约束,不是 count 的职责contains(C++20 起)C++20 为关联容器添加了 contains 成员函数,语义清晰、无需迭代器、无歧义:
if (m.contains(key)) {
// 安全、简洁、意图明确
}
find,但接口封装消除了 end() 比较的出错可能find 或 at(注意 at 抛异常)find != end(),别为了“少打几个字”用 count
key 类型必须严格支持 map 的比较谓词(默认 std::less),否则查找行为未定义——比如自定义类型没重载 operator,或用了自定义 Compare 但 find 传入的 key 不满足其等价规则。