应使用 std::find 判断值是否在 vector 中,它返回迭代器,找到则指向元素,否则等于 end();需包含 ,支持任意可比较类型,时间复杂度 o(n),自定义类型须重载 operator==。

用 std::find 判断值是否在 vector 中最直接
别写循环手动遍历,std::find 是标准且安全的选择。它返回迭代器,找到则指向该元素,没找到就等于 end()。
- 必须包含头文件:
#include <algorithm></algorithm> - 适用于任意可比较类型的
vector(如int、string、自定义类型需重载operator==) - 时间复杂度是 O(n),没有索引加速,纯线性查找
- 示例:
vector<int> v = {1, 3, 5, 7}; if (find(v.begin(), v.end(), 5) != v.end()) { // 找到了 }
std::find 和 std::find_if 别混用
find 只做值相等判断;如果要按条件查(比如“第一个大于 10 的数”),得用 find_if。
-
find第三个参数是具体值,类型必须和容器元素一致 -
find_if第三个参数是谓词(lambda、函数指针或函数对象),更灵活但稍重 - 常见错误:把
find当成支持表达式的接口,结果编译失败——报错通常是no matching function for call to 'find' - 示例(找偶数):
auto it = find_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; });
想频繁查?vector 不是为查找设计的
如果查找操作远多于插入/删除,反复调 find 效率低,应换容器。
- 查得多、改得少 → 改用
std::set或std::unordered_set,count()或find()均为 O(log n) 或平均 O(1) - 需要保持插入顺序 + 快速查 → 可以额外维护一个
unordered_set同步存值,空间换时间 - 用
vector::data()配合std::binary_search?可以,但前提是已排序,且注意它只返回bool,不提供位置
自定义类型使用 find 容易漏掉 operator==
编译器不会自动帮你定义相等逻辑,忘了重载就会报错或行为未定义。
立即学习“C++免费学习笔记(深入)”;
- 错误现象:编译失败,提示
invalid operands to binary expression ('const MyType' and 'const MyType') - 必须在类内或类外定义
operator==,参数常量引用,返回bool - 如果类型有多个成员,记得逐个比较,别只比指针或某个字段
- 示例:
struct Point { int x, y; }; bool operator==(const Point& a, const Point& b) { return a.x == b.x && a.y == b.y; }
find 找不到明明存在的值”,八成是自定义类型没写 operator==,或者用了指针却想比较内容。









