一、std::find
函数
功能:在指定范围内查找特定值,返回第一个匹配元素的迭代器;若未找到,返回 end()
迭代器。
原型:
template <class InputIt, class T>
InputIt find(InputIt first, InputIt last, const T& value);
测试用例:
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// 查找值为 30 的元素
auto it = std::find(vec.begin(), vec.end(), 30);
if (it != vec.end()) {
std::cout << "Found: " << *it << std::endl; // 输出: Found: 30
} else {
std::cout << "Not found" << std::endl;
}
return 0;
}
二、std::find_if
函数
功能:在指定范围内查找满足谓词条件的元素,返回第一个匹配的迭代器;未找到则返回 end()
。
原型:
template <class InputIt, class UnaryPredicate>
InputIt find_if(InputIt first, InputIt last, UnaryPredicate p);
测试用例:
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 3, 5, 7, 8, 9};
// 查找第一个偶数(使用 Lambda 表达式作为谓词)
auto it = std::find_if(vec.begin(), vec.end(), [](int n) {
return n % 2 == 0;
});
if (it != vec.end()) {
std::cout << "First even: " << *it << std::endl; // 输出: First even: 8
} else {
std::cout << "No even found" << std::endl;
}
return 0;
}
三、find
与 find_if
的核心差异
特性 | std::find | std::find_if |
---|---|---|
查找条件 | 直接匹配固定值 (value ) | 通过谓词(函数、Lambda 等)定义复杂条件 |
适用场景 | 精确值查找(如整数、字符串) | 动态或复合条件(如范围、属性判断) |
性能 | 直接比较,无额外开销 | 需调用谓词,可能增加开销(取决于逻辑) |
灵活性 | 低(仅限相等性检查) | 高(支持任意自定义条件) |
四、关键差异总结
-
条件形式:
find
:查找与value
严格相等的元素。find_if
:通过谓词自定义条件(如大于、复合逻辑等)。
-
代码示例对比:
// find: 直接查找值为 5 的元素 auto it1 = std::find(vec.begin(), vec.end(), 5); // find_if: 查找大于 5 的元素 auto it2 = std::find_if(vec.begin(), vec.end(), [](int n) { return n > 5; });
-
性能考虑:
- 两者均为线性搜索(O(n) 复杂度)。
find_if
的谓词若包含复杂逻辑(如动态计算),可能影响性能。
五、进阶用法
自定义对象查找:
struct Person {
std::string name;
int age;
};
std::vector<Person> people = {{"Alice", 25}, {"Bob", 30}};
// 使用 find_if 查找年龄大于 28 的人
auto it = std::find_if(people.begin(), people.end(), [](const Person& p) {
return p.age > 28;
});
六、总结
- 优先
find
:当查找条件为简单相等性检查时(如基本类型、字符串)。 - 选择
find_if
:需处理复杂条件(如类成员、动态计算)时,利用 Lambda 或函数对象提高灵活性。
七、完整样例代码与输出
测试代码
#include <algorithm>
#include <vector>
#include <iostream>
void find_test(void)
{
std::vector<int> vec = {10, 20, 30, 40, 50};
// 查找值为 30 的元素
auto it = std::find(vec.begin(), vec.end(), 30);
if (it != vec.end()) {
std::cout << "Found: " << *it << std::endl; // 输出: Found: 30
} else {
std::cout << "Not found" << std::endl;
}
}
void find_if_test(void)
{
std::vector<int> vec = {1, 3, 5, 7, 8, 9};
// 查找第一个偶数(使用 Lambda 表达式作为谓词)
auto it = std::find_if(vec.begin(), vec.end(), [](int n) {
return n % 2 == 0;
});
if (it != vec.end()) {
std::cout << "First even: " << *it << std::endl; // 输出: First even: 8
} else {
std::cout << "No even found" << std::endl;
}
}
void find_if_test2(void)
{
std::vector<int> vec = {1, 3, 5, 7, 8, 9};
// 查找第一个偶数(使用 Lambda 表达式作为谓词)
auto it = std::find_if(vec.begin(), vec.end(), [](int n) {
return n > 5;
});
if (it != vec.end()) {
std::cout << "First > 5: " << *it << std::endl; // 输出: First even: 8
} else {
std::cout << "No even found" << std::endl;
}
}
struct Person {
std::string name;
int age;
};
void find_if_test3(void)
{
std::vector<Person> people = {{"Alice", 25}, {"Bob", 30}};
// 查找第一个偶数(使用 Lambda 表达式作为谓词)
auto it = std::find_if(people.begin(), people.end(), [](const Person& p) {
return p.age > 28;
});
if (it != people.end()) {
std::cout << "people age > 28: " << it->name << std::endl; // 输出: First even: 8
} else {
std::cout << "No even found" << std::endl;
}
}
int main() {
std::cout << "====================="<< std::endl;
std::cout << "find_test start"<< std::endl;
find_test();
std::cout << "====================="<< std::endl;
std::cout << "find_if_test start"<< std::endl;
find_if_test();
std::cout << "====================="<< std::endl;
std::cout << "find_if_test2 start"<< std::endl;
find_if_test2();
std::cout << "====================="<< std::endl;
std::cout << "find_if_test3 start"<< std::endl;
find_if_test3();
return 0;
}
结果输出
=====================
find_test start
Found: 30
=====================
find_if_test start
First even: 8
=====================
find_if_test2 start
First > 5: 7
=====================
find_if_test3 start
people age > 28: Bob