线性查找:最直接的找法
在写C++程序时,如果数据量不大,最简单的查找方式就是线性查找。比如你手头有一个学生成绩列表,想找某个学生的分数,从头到尾一个一个比对就行。
int linearSearch(int arr[], int n, int target) {
for (int i = 0; i < n; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
这段代码遍历数组,一旦找到目标值就返回下标,没找到就返回-1。虽然效率不高,但胜在逻辑清晰,适合新手理解和调试。
二分查找:效率翻倍的关键
当你处理的数据是有序的,比如电话簿按姓名排序,这时候用二分查找就快多了。每次比较中间元素,就能排除一半的数据。
int binarySearch(int arr[], int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
}
else if (arr[mid] < target) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return -1;
}
注意这里计算 mid 的方式,避免了(left + right)可能溢出的问题。实际项目中,像查找用户ID、定位日志时间点这类场景,二分法很常用。
STL里的查找工具
C++标准库已经封装了不少实用的查找函数,比如 std::find 和 std::binary_search,可以直接拿来用。
#include <algorithm>
#include <vector>
std::vector<int> nums = {1, 3, 5, 7, 9};
auto it = std::find(nums.begin(), nums.end(), 5);
if (it != nums.end()) {
// 找到了,位置是 it - nums.begin()
}
用STL不仅能减少出错概率,还能让代码更简洁。特别是在维护别人写的旧项目时,看到这些标准接口能更快理解意图。
哈希表查找:追求极致速度
如果你需要频繁查找,比如实现一个单词计数器,用 std::unordered_map 能把平均查找时间降到O(1)。
#include <unordered_map>
#include <string>
std::unordered_map<std::string, int> wordCount;
wordCount["hello"]++;
if (wordCount.find("hello") != wordCount.end()) {
// 快速判断是否存在
}
这就像你把常用药放在床头柜,而不是每次都要去卫生间药箱里翻。空间换时间,在性能敏感的程序里特别值得考虑。