set::find返回迭代器,查不到时为end();count返回0或1,适合存在性判断;lower_bound/upper_bound用于定位而非相等查找;const容器中需注意const_iterator和const引用。

set::find 查找元素返回迭代器,找不到就返回 end()
find 是 set 最常用的查找方式,它不返回布尔值,而是返回一个 iterator。查到就指向该元素,查不到就等于 s.end()。
常见错误是直接拿返回值当 bool 用,比如写成 if (s.find(x)) —— 这永远为真,因为迭代器非空指针不等于 false,而且 end() 也不是空指针。
- 正确写法:
if (s.find(x) != s.end()) - 想取值时记得解引用:
*s.find(x)(仅当确定存在时才安全) -
find时间复杂度是O(log n),底层是红黑树二分查找 - 对
const set调用会返回const_iterator,不能用来修改元素(不过set元素本来就不能改)
set::count 只返回 0 或 1,适合判断是否存在
count 在 set 中意义单一:元素要么有(1),要么没有(0)。它和 find 性能几乎一样,内部实现也基本等价,但语义更清晰——你只关心“有没有”,不关心“在哪”。
- 推荐用于存在性判断:
if (s.count(x))简洁且不易错 - 别在
multiset里误用这个习惯:那里count可能返回 >1,而set永远只有 0/1 - 不要用
count去“获取元素值”,它不提供访问路径
为什么 set 没有 find_if 或 lower_bound 的“简易版”?
set 不支持按自定义条件查找(比如“第一个大于 x 的数”),除非你用 lower_bound 或 upper_bound。它们不是查找相等,而是定位插入位置。
立即学习“C++免费学习笔记(深入)”;
-
s.lower_bound(x)返回第一个>= x的迭代器 -
s.upper_bound(x)返回第一个> x的迭代器 - 两者都要求
x类型可和元素比较,且必须支持(默认或自定义比较器) - 如果只是想找“等于 x”,
find比lower_bound+ 判等更直观、更少出错
实际用例中容易忽略的 const 正确性
当你把 set 传进函数参数,尤其是 const set,调用 find 得到的是 const_iterator,解引用后得到的是 const int& —— 这意味着你不能把它赋给非常量引用,也不能调用非常量成员函数。
- 错误:
int& r = *s.find(5);(类型不匹配) - 正确:
const int& r = *s.find(5);或int x = *s.find(5);(拷贝值) - 如果函数接口允许,优先用
count避开迭代器类型问题
find 和 count 的区别,而是混用非常量/常量容器时,编译器报出一长串模板错误,而你盯着 *it 发呆半天没意识到 it 是 const 的。









