未排序 vector 用 std::find,返回迭代器支持操作;已排序优先用 std::binary_search,仅返回 bool 判断存在性,要求容器已排序且不检查,误用导致未定义行为。

直接结论:未排序的 vector 用 std::find;已排序的,优先用 std::binary_search ——但别只看“快”,得看你要什么结果。
std::find 适合「找得到就停」的场景
它遍历容器,遇到第一个匹配值立即返回迭代器,不继续扫。时间复杂度是 O(n),但实际中往往远好于最坏情况。
- 支持任意容器(
vector、list、deque),不要求排序 - 返回的是迭代器,能直接解引用取值、或用于后续操作(如擦除:
v.erase(it)) - 对自定义类型必须重载
operator==,否则编译失败 - 如果只判断「是否存在」,用
it != v.end()即可,比std::count更轻量
std::binary_search 只认「排好序」的 vector
它不做任何检查,直接二分——若传入未排序的 vector,行为未定义(可能返回 false,也可能误判 true)。
- 必须先调用
std::sort(v.begin(), v.end()),且排序是一次性成本;后续多次查找才摊薄开销 - 只返回
bool,无法知道位置、无法取值、无法删除——纯存在性判断 - 底层不依赖
operator==,而是用比较(所以自定义类型要提供 <code>operator 或传比较函数) - 数据量 ≥ 数千时,O(log n) 的优势才明显;小 vector(比如 find 反而更快(分支预测友好、无函数调用开销)
别踩这些坑
常见错误不是写错语法,而是用错前提:
立即学习“C++免费学习笔记(深入)”;
- 对未排序
vector直接调std::binary_search→ 结果不可靠,调试时可能偶然“碰对”,上线后随机翻车 - 用
std::find查找大量重复值却没 break → 它本就只返回第一个,无需额外逻辑 - 在循环里反复对同一
vector调std::binary_search却没缓存排序状态 → 每次都该先确认是否已排好序,或封装成类维护有序性 - 误以为
std::binary_search比std::find“更高级” → 它只是更窄:只解决一个子问题(存在性 + 有序前提)
真正关键的不是选哪个函数,而是你手里的 vector 是否稳定有序、以及你下一步要干什么——要位置?要值?要删它?还是只打个勾说“有”?这些决定了接口边界,也决定了性能真实落点。



















