C++11 标准库 `find` 与 `find_if` 详解

devtools/2025/3/31 4:38:36/
一、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;
}

三、findfind_if 的核心差异

特性std::findstd::find_if
查找条件直接匹配固定值 (value)通过谓词(函数、Lambda 等)定义复杂条件
适用场景精确值查找(如整数、字符串)动态或复合条件(如范围、属性判断)
性能直接比较,无额外开销需调用谓词,可能增加开销(取决于逻辑)
灵活性低(仅限相等性检查)高(支持任意自定义条件)

四、关键差异总结

  1. 条件形式

    • find:查找与 value 严格相等的元素。
    • find_if:通过谓词自定义条件(如大于、复合逻辑等)。
  2. 代码示例对比

    // 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; });
    
  3. 性能考虑

    • 两者均为线性搜索(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

http://www.ppmy.cn/devtools/171063.html

相关文章

信创-人大金仓数据库创建

一. 官文 资源下载地址 https://download.kingbase.com.cn/xzzx/index.htm 下载安装文件 下载授权文件 产品文档地址&#xff1a;https://help.kingbase.com.cn/v8/index.html 二. 概念 2.1 体系结构 ‌ 实例结构 ‌&#xff1a;由数据库文件和 KingbaseES 实例组成。数据…

华为交换相关

端口模式 &#xff08;1&#xff09;access&#xff1a;只能属于单个VLAN&#xff0c;一般用于连接计算机端口 &#xff08;2&#xff09;trunk&#xff1a;端口允许多个VLAN通过&#xff0c;可以接收和发送多个VLAN报文&#xff0c;默认情况下只有管理VLAN不携带标签信息 &…

机器学习之KMeans算法

文章目录 引言1. KMeans算法简介2. KMeans算法的数学原理3. KMeans算法的步骤3.1 初始化簇中心3.2 分配数据点3.3 更新簇中心3.4 停止条件 4. KMeans算法的优缺点4.1 优点4.2 缺点 5. KMeans算法的应用场景5.1 图像分割5.2 市场细分5.3 文档聚类5.4 异常检测 6. Python实现KMea…

前端高级CSS用法

前端高级CSS用法 在前端开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;不仅是用来控制网页的外观和布局&#xff0c;更是实现复杂交互和动态效果的关键技术之一。随着前端技术的不断发展&#xff0c;CSS的用法也日益丰富和高级。本文将深入探讨前端高级CSS的用法&a…

torch.nn和torch.nn.function的区别

torch.nn一般作为class提供&#xff0c;需要实例化后使用 torch.nn.functional一般作为函数提供&#xff0c;无需实例化可直接使用 例&#xff1a; import torch import torch.nn.functional as Fx torch.tensor([[1,2,3], [1,2,3], [1,2,3], [1,2,3]], dtype torch.double…

WRC世界机器人大会-2024年展商汇总

2024世界机器人大会 时间&#xff1a;2024年8月21日至25日 地点&#xff1a;北京经济技术开发区北人亦创国际会展中心 大会主题&#xff1a;共育新质生产力&#xff0c;共享智能新未来 2024世界机器人博览会亮点纷呈&#xff0c;20余款人形机器人整机将亮相博览会&#xff…

文件操作助手

文件操作助手 在我们实现一个大型项目时&#xff0c;往往会有一个公共模块&#xff0c;这个公共模块是公用的&#xff0c;里面可能会包含文件操作助手、字符串操作助手、时间戳操作助手… 而我们今天就来实现一个文件操作助手&#xff0c;里面包含的功能有&#xff1a; 判断…

【机器人】论文分析 ASGrasp 通用透明物体重建、6-DoF抓取预测

在机器人抓取领域&#xff0c;透明和镜面物体的抓取一直是个难题。 物体是透明的&#xff0c;光线会直接穿过&#xff0c;深度相机就很难准确测量出杯子的实际位置和形状&#xff0c;很难准确地感知这类物体的深度信息。 ASGrasp核心是两层学习型立体网络&#xff0c;能够同时…