std::find需传迭代器范围而非裸数组名,对栈数组用std::begin/ end更安全,动态数组建议改用vector;未找到时返回结束迭代器,须检查再解引用;排序数组可用binary_search或lower_bound提升效率。

用 std::find 在 int 数组里找值,别忘了传迭代器范围
std::find 不接受裸数组名,它只认迭代器。直接写 std::find(arr, 5) 会编译失败——因为第一个参数必须是起始迭代器,第二个是结束迭代器,第三个才是要找的值。
- 对栈上定义的数组(如
int arr[5] = {1,2,3,4,5};),用std::find(arr, arr + 5, 42) - 更安全的做法是配合
std::size:std::find(std::begin(arr), std::end(arr), 42),避免硬编码长度 - 如果数组是动态分配的(
int* arr = new int[5];),你得自己记住长度,std::find无法推导;此时建议改用std::vector
std::find 找不到时返回什么?别直接解引用
找不到时返回的是“结束迭代器”,也就是你传进去的第二个参数值。对数组来说就是 arr + N 或 std::end(arr) —— 它不指向有效元素,解引用必崩。
- 必须先判断:
if (it != std::end(arr)) { /* 找到了,it 指向目标 */ } - 错误写法:
int val = *std::find(...);—— 没检查就解引用,运行时segmentation fault或静默错值 - 注意:返回的是迭代器,不是下标。要下标得手动算:
it - std::begin(arr)
比 std::find 快一点?别迷信,先看数据量和是否已排序
对普通 int 数组,std::find 就是线性扫描,O(n)。没有“更快”的标准库替代方案,除非你主动预处理。
- 如果数组已排序,用
std::binary_search(只判存在)或std::lower_bound(获取位置),O(log n) - 如果频繁查找、数据不变,考虑建
std::unordered_set<int></int>,平均 O(1),但有哈希开销和内存成本 - 别为 10 个数去写二分或建哈希表——现代 CPU 对小数组的线性扫描快得超乎直觉
用 std::vector 替代裸数组,能省掉一堆边界计算
裸数组传大小、算指针、记生命周期,一不留神就越界或悬垂。而 std::vector 把这些都封装好了。
立即学习“C++免费学习笔记(深入)”;
- 写法更直觉:
auto it = std::find(v.begin(), v.end(), 42);,不用手算v.data() + v.size() - 配合范围 for 或
std::ranges::find(C++20)更简洁:std::ranges::find(v, 42) - 唯一代价是极小的堆分配(除非用
std::vector的 small buffer 优化实现),但换来的是确定的安全边界
最容易被忽略的是:裸数组在函数参数中会退化成指针,丢失长度信息。一旦把数组传进函数,std::size 和 std::begin 就失效了——这时候要么额外传长度,要么改用 std::span(C++20)或 std::vector。









