查找类算法
查找类算法,这些算法定义在 <algorithm> 头文件中,能高效地在容器(如 vector、list、set 等)中完成查找、匹配、计数等操作。
基础查找类算法
find 查找单个元素
在指定范围内查找第一个匹配目标值的元素,返回指向该元素的迭代器;若未找到,返回结束迭代器 end()。
使用场景:任意可遍历的容器(vector、list、deque 等),无需容器有序。
vector<int> v = { 5, 10, 15, 20, 25 };
set<int> s = { 1, 2, 3, 4, 5 };
auto ret = find(v.begin(), v.end(), 10);
// 使用前先判断
if (ret != v.end())
{
cout << *ret << endl; // 10
}
auto ret1 = find(s.begin(), s.end(), 5);
if (ret1 != s.end())
{
cout << *ret1 << endl; // 5
}
find_if 按条件查找
查找第一个满足自定义条件的元素,条件通过函数(或 lambda 表达式)指定。 适用场景:需要按 “条件” 查找(如找第一个偶数、第一个大于 10 的数),而非固定值。
vector<int> v = { 5, 10, 15, 20, 25 };
// 找第一个偶数
auto ret = find_if(v.begin(), v.end(), [](int val) {return val % 100 == 0; });
if (ret != v.end())
{
cout << *ret << endl;
}
count / count_if 统计元素个数
count:统计范围内等于目标值的元素个数;count_if:统计范围内满足自定义条件的元素个数。
vector<int> v = { 1, 2, 2, 2, 5, 7, 9 };
// 统计元素2的个数
int ret = count(v.begin(), v.end(), 2);
cout << ret << endl; // 3
// 统计奇数的个数
ret = count_if(v.begin(), v.end(), [](int val) {return val % 2 != 0; });
cout << ret << endl; // 4
有序容器查找算法
以下算法要求容器必须有序(如排序后的 vector、set、map),效率远高于通用查找
binary_search 二分查找是否存在
判断有序范围内是否存在目标值,返回 bool 类型(true/false)。
vector<int> v = { 1, 2, 2, 2, 5, 7, 9 };
// 二分查找元素5是否存在
bool ret = binary_search(v.begin(), v.end(), 5);
cout << ret << endl; // 1
lower_bound / upper_bound 查找边界
lower_bound:返回有序范围内第一个大于等于目标值的元素迭代器;upper_bound:返回有序范围内第一个大于目标值的元素迭代器;- 两者结合可获取 “等于目标值的元素区间”(常用于去重、统计有序容器中目标值的个数)。
vector<int> v = { 1, 2, 2, 2, 5, 7, 9 };
auto ret1 = lower_bound(v.begin(), v.end(), 2);
auto ret2 = upper_bound(v.begin(), v.end(), 2);
// 可以计算出存在几个2
cout << ret2 - ret1 << endl; // 3
结束语
- 通用查找(
find/find_if/count):适用于任意容器,无需有序,时间复杂度 O(n),适合小规模数据或无序场景; - 有序查找(
binary_search/lower_bound/upper_bound):仅适用于有序容器,时间复杂度 O(logn),效率极高,是有序场景的首选; - 核心注意点:使用有序查找算法前,必须确保容器已排序(可通过
sort算法排序),否则结果不可靠。