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

news/2025/3/29 5:46:29/
一、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/news/1582890.html

相关文章

windows远程连接ubantu

目录 前言&#xff1a; 1.在ubantu端 &#xff08;1&#xff09;确保 Ubuntu 系统开启 SSH 服务 &#xff08;2&#xff09;获取ubantu系统的ip地址 2. 在windows端 &#xff08;1&#xff09;在vscode中安装Remote - SSH扩展 &#xff08;2&#xff09;下面是vscode的一…

【STM32实物】基于STM32的太阳能充电宝设计

基于STM32的太阳能充电宝设计 演示视频: 基于STM32的太阳能充电宝设计 硬件组成: 系统硬件包括主控 STM32F103C8T6、0.96 OLED 显示屏、蜂鸣器、电源自锁开关、温度传感器 DS18B20、继电器、5 V DC 升压模块 、TB4056、18650锂电池、9 V太阳能板、稳压降压 5 V三极管。 功能…

C++红黑树的深入解析:从理论到实践

红黑树作为一种自平衡的二叉搜索树&#xff0c;是计算机科学中的经典数据结构之一&#xff0c;广泛应用于各种需要高效查找、插入和删除操作的场景中&#xff0c;比如STL中的 map 和 set。虽然它的基本原理并不复杂&#xff0c;但在实现过程中&#xff0c;需要处理许多细节&…

Linux内核的页面错误:原因与解决方案

当程序访问虚拟内存中的一个页面时&#xff0c;如果该页面当前不在物理内存中&#xff0c;就会触发一个称为"page fault"&#xff08;页异常&#xff09;的异常。操作系统需要处理这个异常&#xff0c;并将所需页面从磁盘加载到内存中。实现虚存管理的一个关键是page…

常见框架漏洞之一:Thinkphp5x

ThinkPHP是为了简化企业级应⽤开发和敏捷WEB应⽤开发⽽诞⽣的&#xff0c;是⼀个快速、兼容⽽且简单的轻量级国产PHP开发框架&#xff0c;诞⽣于2006年初&#xff0c;原名FCS&#xff0c;2007年元旦正式更名为 ThinkPHP&#xff0c;遵循Apache2开源协议发布&#xff0c;从Stru…

Simula语言的安全开发

Simula语言的安全开发 引言 在计算机科学的历史长河中&#xff0c;Simula 语言作为面向对象编程的奠基者&#xff0c;有着无可替代的地位。它的出现不仅为后来的各种编程语言奠定了理论基础&#xff0c;也深刻影响了软件开发方法论和设计模式的演变。然而&#xff0c;随着软件…

使用 ByteDance 的 UI-TARS Desktop 探索 AI 驱动的 GUI 自动化新前沿

文章目录 UI-TARS Desktop 是什么&#xff1f;技术亮点应用场景如何快速上手&#xff1f;与其他技术的对比未来展望结语 随着人工智能技术的快速发展&#xff0c;AI 正在从单纯的文本生成和图像识别迈向更复杂的交互场景。ByteDance 近期推出的 UI-TARS Desktop&#xff08;基于…

【差分隐私相关概念】最大化似然函数就是最小化L1范数

1. 噪声分布与最大似然估计的关系 噪声类型&#xff1a;矩阵机制中&#xff0c;噪声 η r ~ − A x \eta \widetilde{\mathbf{r}} - \mathbf{Ax} ηr −Ax 服从 拉普拉斯分布 η ∼ Lap ( Δ A / ϵ ) \eta \sim \text{Lap}(\Delta_\mathbf{A}/\epsilon) η∼Lap(ΔA​/ϵ…