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

std::find操作与stl中find成员函数的区别 这会消耗 O(n) 的时间(其中 n 是被删除元素后面的元素数量)。为了避免这个问题,你可能需要采用不同的策略,例如使用一个额外的数据结构来跟踪哪些元素被删除。在vector中用erase(),推荐用下面的写法:(find找到与nums[i]相等的第一个元素就会返回,不一定是nums[i]本身)此外,当修改 vector 的大小(例如通过调用 erase)时,需要特别注意不能超出其边界。中查找键值为 3 的元素,如果找到,我们打印出该键值。中查找值为 3 的元素,如果找到,我们打印出该元素。 阅读详情
AI摘要

本文详细介绍了C++11标准库中find与find_if函数。find用于在指定范围查找特定值,find_if查找满足谓词条件的元素。还分析了两者核心差异,如条件形式、性能等。给出进阶用法,如自定义对象查找。总结指出简单相等检查用find,复杂条件用find_if。

一、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::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
C++ std::find_if用法 是 C++ 标准库中的一个算法函数,用于在指定范围内查找满足特定条件的元素,并返回第一个满足条件的元素的迭代器。用于查找第一个大于 5 的元素,并返回指向该元素的迭代器。如果找到,则输出该元素的值,否则输出未找到的消息。 阅读详情

相关推荐

C++11 std::find_if

std::find用于查找给定区间里是否有等于我们传入数,但有时候我们可能不是判断是否相等这么简单,我们可能有其他判断需求,比如对于People数组,我们想查找是否有年龄大于50的People。 template< class InputIt, class UnaryPredicate > InputIt find_if( InputIt first, InputIt last, UnaryPredicate p ); 第三个参数是我们自定义的判断条件,它必须

二进制君 9490

std::find_if

std::find_if 是 C++ 中 STL 库中的一个函数,它可以在一个给定的范围内查找第一个符合指定条件的元素。它接收一个范围和一个谓词(即一个判断条件的函数)作为参数,返回第一个满足该条件的元素的迭代器。如果在整个范围内都找不到满足条件的元素,则返回 last 参数指向的位置。 示例代码: #include <algorithm> #include <iostream&...

weixin_42599558的博客 4763

Windows下QT5.15.2安装MQTT模块全攻略(附分支选择避坑指南)

本文详细介绍了在Windows环境下为QT5.15.2安装MQTT模块的完整流程,包括环境准备、源码获取、编译配置及项目集成等关键步骤。特别针对分支选择、依赖项处理和常见错误提供了实用解决方案,帮助开发者高效完成MQTT模块的安装与调试,适用于物联网开发场景。

weixin_29224589的博客 466

C++中的std::find_if函数详解

C++中的std::find_if函数详解

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 6964

聚宽策略实盘新路径:不开通QMT , 小资金自动化交易解决方案

聚宽策略实盘新路径:不开通QMT , 小资金自动化交易解决方案

u011111246的博客 1467

手把手教你用Three.js+Vue打造3D机房可视化系统(附完整代码)

本文详细介绍了如何使用Three.js与Vue 3构建企业级3D机房可视化系统。从技术选型、项目架构设计到3D场景构建、设备建模与渲染策略,提供了完整的开发方案和实战代码。重点讲解了如何实现设备状态实时监控、交互操作与性能优化,帮助开发者快速掌握3D可视化开发的核心技术。

ttt77的博客 317

STL算法库(1)

C++

小麦大大博客 285

避开这些坑!Kaggle数据集下载常见问题及解决方案(含Header Editor插件配置)

本文针对Kaggle数据集下载过程中的常见难题,提供了系统性的解决方案。重点解决了验证码无法显示、API安装失败、密钥文件配置错误及下载命令执行问题,并详细介绍了使用Header Editor插件配置请求头以绕过验证码障碍的实战方法,帮助用户高效获取数据。

weixin_29043895的博客 301

C++提高编程

学习目标:vector中存放自定义数据类型,并打印输出//自定义数据类型public:mAge = age;//存放对象//创建数据it!= v.end();it++) {//放对象指针//创建数据it!= v.end();test02();return 0;

丰锋的博客 352

腾讯滑块验证码防水墙 tdc.js 补环境实录

腾讯滑块验证码破解研究摘要 本文记录了破解腾讯防水墙滑块验证码(tdc.js)的全过程。研究重点包括: 流程分析:通过抓包分析验证码完整链路,识别出关键参数collect和eks需从tdc.js虚拟机获取 环境模拟:采用渐进式补环境方法,针对字节码虚拟机特性构建完整的window对象,包括navigator、screen、canvas等API的精确模拟 核心破解:成功调用TDC.getData()和TDC.getInfo()获取关键参数,解决POW计算和滑块缺口识别问题 优化调整:针对errorCode 5

码王吴彦祖的博客 227

Vue3 - Element Plus上传组件el-upload上传多个文件时,让on-change监听事件仅执行一次并获取最终文件列表方法(开启多选文件并手动上传,拿到文件列表统一循环调用接口上传)

vue3,elementplus,Upload上传,el-upload,文件上传组件,上传组件on-change里执行多次,取消自动上传后change重复执行问题,upload上传多个文件后导致on-change执行多次拿不到最终文件列表,Element-plus的upload组件on-change不断执行怎么办,上传多个文件多次执行调用,上传多个文件时如何只执行一次on-change方法拿到最终的文件列表,vue3elementplus上传组件开启多个上传后导致change方法执行好几次,仅调用一

🏆 前端领域优质创作者 1万+

C++ std::find()实例讲解

本文章向大家介绍C++ std::find()实例讲解,主要分析其语法、参数、返回值和注意事项,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

wuxiaopengnihao1的博客 9285

AI游戏制作07——波次计时器,敌人按波次生成

AI游戏制作07——波次计时器,敌人按波次生成

qq_40572023的博客 47

详解std::find_if ()

最近的项目中标准库函数的使用比较频繁,最开始看别人的博客,总感觉很多博文都停留在套用层次,我是一个比较爱深究的人,闲暇之余查阅了很多文档。终于找到了满足我好奇心的解释。实际上像std::find_if()  std::for_each() 这样的函数就是简单的for循环,为了让我们少些代码而已^_^。又说了一大堆废话,好切入主题让我们一起揭开std::find_if() 神秘面纱。 它的定义

ypy9323的博客 2万+

IMX335摄像头原理图设计,已量产

从工程组织上看,IMX335 模组和 IMX415 模组属于同一类产品:核心矛盾不是外设多,而是高速图像链路、电源域和调试接口要同时兼顾。ATK-MCIMX335 这张图的结构也很直接,三路 LDO、本地 24MHz 可选时钟、4-lane MIPI 数据对和一组主板侧标准接口,构成了一张非常典型的量产摄像头子板。

不脱发的程序猿 439

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ STL find与find_if的使用

STL的find,find_if函数提供了一种对数组、STL容器进行查找的方法。使用该函数,需要加上#include <algorithm> 现在,我们要查找一个list中的数据,通常使用find(),vector,deque同理, 如果是c++内置的类型,比如Int,double,string等,直接使用就行了 int main() { list<int> lst...

sinat_31608641的博客 7618

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

std::find_if函数结合函数对象、lambda表达式查找元素

std::find_if函数头文件:#include 里面。函数意义:查找满足条件的元素的第一次出现。时间复杂度O(n)。参数:first − 输入迭代器到初始位置。last − 最终位置的最终迭代器。pred − 一元谓词,即:接收一个参数的函数对象或者一个参数的lambda表达式,return:返回一个迭代器,指向 (first,last) 范围内满足条件的第一个元素.没有找到,指向最后一个元素。谓词介绍返回bool类型的仿函数称为谓词。

hanxiaoyong_的博客 2058

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

std::find的使用

std::find可用于查找容器中是否存在某个特定值,对于基本类型的容器用法 int searchValue = 42; vector<int>::const_iterator result= find(vec.begin(), vec.end(), searchValue); if(result == vec.end()) { cout << "没找到" << endl; } else { doSth(*result); } 但是其实自.

wangpeng2011314的专栏 1万+

标准库算法函数:std::find_if

下面是函数原型该函数,用来在容器中查找符合条件的元素,

金色的省略号 1772

find_if函数

1.功能:按条件查找元素 2.函数原型 find_if( iterator beg, iterator end, _pred) 按值查找元素,找到的话返回指定位置的迭代器,找不到则返回结束迭代器位置 beg :开始迭代器 end :结束迭代器 _pred :函数或者谓词 (返回bool类型的仿函数) #include<iostream> #include<vector> #include<string> #include<algorithm>

sang_12345的博客 9477

突破编程_C++_STL教程( find 算法)

C++ STL教程: find 算法

突破编程 3880

std::find 和 std::find_if

std::find和都是 C++ 标准库中的算法,用于在容器或范围内查找元素。std::findstd::find是一个简单的查找算法,用于查找特定值。它接受两个迭代器和一个要查找的值作为参数,然后在指定范围内查找该值。如果找到,它将返回指向该值的迭代器;否则,它将返回迭代器指向范围末尾。这将查找容器numbers中的值为 5 的元素。用于查找满足特定条件的元素。它接受两个迭代器和一个可调用的谓词函数作为参数。谓词函数返回true或false,表示是否满足条件。在范围内查找第一个使谓词函数返回true。

C or CPP 1913

c++ std::vector std::find_if 自定义结构体 查找

如果std::vector中元素是结构体,那查找符合某几个条件的元素时,使用上面的compare就不合适了,上面的只能是单一元素。使用重载结构体的==操作符及构造仿函数来解决此问题。//用于find_if 仿函数,重载操作符() 2025.8.4。

u012719076的博客 1169

C++ 泛型算法 std::find() ,用于在数组或标准库容器中查找指定元素

ffind() 函数是一个 泛型算法,可以用于操作所有STL容器。它用于在数组或标准库容器(如vector,map)中查找指定元素,查找成功则返回一个指向指定元素的迭代器,查找失败则返回end迭代器。

qq_43799400的博客 2万+

STL find_if()函数

find _if 函数总结

duringsummer的博客 684
上一篇: 《尘埃落定》读后感
下一篇: 软件研发管理者管理团队建议
froxy
博客等级 码龄15年 208粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值