std::find,std::find_if对类进行查找

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

STL的find,find_if函数提供了一种对数组、STL容器进行查找的方法。使用该函数,需 #include <algorithm>

我们查找一个list中的数据,通常用find(),例如:

 

using namespace std;

 

int main()

{

list<int> lst;

lst.push_back(10);

lst.push_back(20);

lst.push_back(30);

 

list<int>::iterator it = find(lst.begin(), lst.end(), 10); // 查找list中是否有元素“10”

if (it != lst.end()) // 找到了

{

// do something 

}

else // 没找到

{

// do something

}

 

return 0;

}

 

那么,如果容器里的元素是一个类呢?例如,有list<CPerson> ,其中CPerson类定义如下:

 

class CPerson

{

public:

CPerson(void); ~CPerson(void);

 

public:

int age; // 年龄

};

 

那么如何用find()函数进行查找呢?这时,我们需要提供一个判断两个CPerson对象“相等”的定义,find()函数才能从一个list中找到与指定的CPerson“相等”的元素。

这个“相等”的定义,是通过重载“==”操作符实现的,我们在CPerson类中添加一个方法,定义为:

 

bool operator==(const CPerson &rhs) const;

 

实现为:

 

 

bool CPerson::operator==(const CPerson &rhs) const

{

return (id == rhs.age);

}

然后我们就可以这样查找(假设list中已经有了若干CPerson对象)了:
list<CPerson> lst;
//////////////////////////////////
// 向lst中添加元素,此处省略
//////////////////////////////////
CPerson cp_to_find; // 要查找的对象
cp_to_find.age = 50;
list<CPerson>::iterator it = find(list.begin(), list.end(), cp_to_find); // 查找

if (it != lst.end()) // 找到了

{

// do something 

}

else // 没找到

{

// do something

}

 

 

 

这样就实现了需求。

 

 

有人说,如果我有自己定义的“相等”呢?例如,有一个list<CPerson*>,这个list中的每一个元素都是一个对象的指针,我们要在这个list中查找具有指定age的元素,找到的话就得到对象的指针。

这时候,你不再能像上面的例子那样做,我们需要用到find_if函数,并自己指定predicate function(即find_if函数的第三个参数,请查阅STL手册)。先看看find_if函数的定义:

 

 

template<class InputIterator, class Predicate>
   InputIterator find_if(InputIterator _First, InputIterator _Last, Predicate _Pred);
Parameters
_First

An input iterator addressing the position of the first element in the range to be searched.

_Last

An input iterator addressing the position one past the final element in the range to be searched.

_Pred

User-defined predicate function object that defines the condition to be satisfied by the element being searched for. A predicate takes single argument and returns true or false.

我们在CPerson类外部定义这样一个结构体:
typedef struct finder_t
{
finder_t(int n) : age(n) { } bool operator()(CPerson *p) { return (age == p->age); } int age;
}finder_t;
然后就可以利用find_if函数来查找了:
list<CPerson*> lst;
//////////////////////////////////
// 向lst中添加元素,此处省略
//////////////////////////////////
list<CPerson*>::iterator it = find_if(lst.begin(), lst.end(), finder_t(50)); // 查找年龄为50的人

if (it != lst.end()) // 找到了

{

cout << "Found person with age : " << (*it)->age;

}

else // 没找到

{

// do something

}

 

ranges::find find_if find_if_not find_first_of find_last find_last_if find_last_if_not find_end adja std::ranges::std::find std::ranges::find_if std::ranges::find_if_not std::ranges::find_first_of std::ranges::find_last std::ranges::find_last_if std::ranges::find_last_if_not std::ranges::find_end std::ranges::adjacent_find 阅读详情

相关推荐

C++ std::find_if用法

是 C++ 标准库中的一个算法函数,用于在指定范围内查找满足特定条件的元素,并返回第一个满足条件的元素的迭代器。用于查找第一个大于 5 的元素,并返回指向该元素的迭代器。如果找到,则输出该元素的值,否则输出未找到的消息。

mls805379973的博客 3262

c++标准模板(STL)(std::list)(六)

std::list 是支持常数时间从容器任何位置插入和移除元素的容器。不支持快速随机访问。它通常实现为双向链表。与 std::forward_list 相比,此容器提供双向迭代但在空间上效率稍低。 在 list 内或在数个 list 间添加、移除和移动元素不会非法化迭代器或引用。迭代器仅在对应元素被删除时非法化。

qq_40788199的博客 2010

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

C++中关于find和find_if的理解

find提供了一个对容器的查找,而find_if更倾向于提供了对对象的查找。使用它们时需要包含头文件#include<algorithm> //find提供原始容器的查找 std::list<int>listFind; for (int i = 0; i < 3;i++) { listFind.push_back(i); } std::list<int>::iterator ite = find(listFi...

ycf623106997的博客 1637

[C++谓词:函数对象的神器]

操作符()函数接受一个或多个参数,并返回bool值,用于实现谓词的规则。以std::less为例,它是一个二元谓词,对于两个参数x和y,它返回true当且仅当x < y。C++中的谓词(Predicate)是指可以作为函数参数,并且返回值类型为bool型的函数对象。在STL中,谓词被广泛用于算法函数的参数中,用于实现条件判断、元素比较等功能,是函数对象的重要应用。上述代码中,我们通过匿名函数作为谓词,实现了查找容器中第一个偶数元素的功能。总之,作为函数对象的重要应用,谓词是C++中不可或缺的工具之一。

TechWhizZ的博客 170

INS/伪距组合导航(1)

星间单差GNSS/INS伪距紧组合

u014430081的博客 875

【涨函数】std::find,std::find_if对类进行查找

STL的find,find_if函数提供了一种对数组、STL容器进行查找的方法。使用该函数,需 #include 我们查找一个list中的数据,通常用find(),例如: using namespace std; int main() { list lst; lst.push_back(10); lst.push_back(20); lst.p

华秋实的专栏 7673

手把手教你用LangChain4j打造一个“会追问”的AI客服:以航空货运下单为例

本文详细介绍了如何使用LangChain4j构建一个能够主动追问的航空货运AI客服系统。通过对话状态管理、信息缺口识别和渐进式引导等核心技术,实现高效的多轮对话交互。文章包含从交互设计到代码实现的完整指南,特别强调了提示词(Prompt)在优化AI行为中的关键作用,帮助开发者打造更智能的客服解决方案。

weixin_28731223的博客 154

(莫寒杂记) C++ STL std::map 使用值来进行查找

文章目录概要介绍find_if 函数单独函数专门处理参考文章附录 概要介绍   我们都熟知 STL 中模板库的std::map可以按key查找对应的值,有些应用中可能会出现 Value 也是唯一的需求状态,举例而言,如果Value中保存的是GUID等唯一性数值,那么key-value 对应关系就从1:N 变成了 1:1。   如果想要以key查找,那么find已经足够了,如果想按value查找,那就得研究下find_if函数了。 find_if 函数 参考链接:std::find_if template &

莫寒技术人生 2028

蓝桥杯FPGA赛道积分赛

代码如下: 按键驱动 代码如下 按键驱动 代码如下: 顶层文件 按键驱动 数码管驱动 声明:本代码借鉴网络资料,如有侵权和错误请联系作者删除。我是从寒假开始备赛的,由于我基础不行,备赛过程中也是混混呃呃的,备赛效率不高,总体来说备赛不认真,有点拖拉,但是最后我也坚持备赛到了今天,在备赛过程中,即复习了旧的东西,也学到了新的东西,总结起来还是有点收获的,后天北京、天津、河北地区就要进行省赛了,我会全力以赴,不管结果怎么样,尽力就好,最后祝大家都能

weixin_69804913的博客 1994

AxMath行间公式转化为office公式求和符号以及编号显示问题

AxMath行间公式转化为office公式求和符号以及编号显示问题问题描述解决方法 问题描述 首先打出axmath公式,如下: 转换后的OfficeMath公式: 字体先不说,word公式字体默认cambria math且无法编辑。比较难受的一点是求和符号与后面的 ai+bi2a_i+b_i^2ai​+bi2​比例不匹配啊!正常的比例应该是: (虽然也不太正常,将就下) 解决方法 点击变换后的office公式右侧,选择更改为"显示" 可以看到,多了一些软回车符号(⬇),如果你想删除它,不要直接选中

weixin_43543177的博客 4655

C++ 重载==运算符,判断结构体是否相等 使用find()查找vector中是否存在某个结构体struct元素

C++ 重载==运算符,判断结构体是否相等 使用find()查找vector中是否存在某个结构体struct元素

ReaderWithNoEmotion 1785

【MFiX后处理】MFiX中使用des_usr_var输出颗粒的传热量(2020-11-27更新变更输出变量名方法)

参考之前Yin的那一篇博客 https://www.cnblogs.com/Jay-CFD/p/10621274.html 输出一下颗粒传热量 使用的算例是fluid_bed_dem_2d 打开des scalar tracking 前面都和Yin那篇一样,打开enable user scalar tracking 输入2 因为第一个用来测试Y加速度了 第二个输出传热量 然后在output vtk中勾选好 更改源代码 源代码为des_thermo_newvalues.f 在mfix-GUI自带的ed

beidou111的博客 1533

使用C++的模板和std::any实现增删改查业务代码复用

本文介绍如何利用C++的模板和`std::any`类型设计一个通用的对象管理器,以处理不同类型对象的增删改查操作。

Where there is life, there is hope. 475

8、音频运行时系统的架构设计

本文深入探讨了音频运行时系统的分层设计及其优势,包括逻辑层和物理层的功能划分。通过分层设计,开发者可以更轻松地管理和优化音频资源,确保其在不同平台上的高效运行。文章还介绍了平台适配与优化、错误处理与调试以及未来发展方向等内容,为开发者提供了宝贵的参考和指导。

juice的博客 463

【BUG已解决】ImportError: cannot import name ‘OpenAI‘ from ‘openai‘ 解决方案

的核心是版本不匹配用确认当前版本如果是 0.x 版本 →升级到 1.x升级后代码语法要同步改为团队协作项目务必在中锁定版本号,避免"我这能跑,你那不能跑"的问题对接国产模型时,只需替换base_url参数,SDK 调用方式完全一致。

一键难忘的博客 1万+

C++ 仿函数VECTOR中查找

class findx //仿函数 用来查找容器中元素 { public:           findx(const int Y,int M, int D){Year=Y;Month=M;Day=D;}           bool operator()(STRING& t) //重载() {           if(t.year == Year && t.

从心的博客 855

uniapp - 超详细 H5 网页利用 uni.downloadFile 下载 URL 文件流并调用浏览器下载功能效果,前台通过请求后端接口获取文件并下载保存到本地(支持电脑PC与手机移动端H5)

uniapph5网页下载文件,uniapp网站下载文件流,uniapp的移动端h5实现接口url文件下载,uniapph5页面在浏览器中如何下载指定url文件流文件并保存到本地,uniapp移动端h5调用后端接口保存文件到本地,uniapph5通过下载后获得临时路径怎么让浏览器弹出下载,uniapp怎么请求接口下载到文件,得到Blob临时路径对象后如何下载到本地,浏览器怎么下载blob对象,uniapp二进制文件流下载,uniapph5中的文件流下载和指定的url下载详细教程,uniappapp移

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

vector检索

std::vector<StAlarmInfo > g_vec; UINT j =1; std::vector<StAlarmInfo *>::iterator iter = std::find_if (g_vec.begin(), g_vec.end(), Find_AutoID_AlInfo(j));if(iter != g_vec.end() ...

weixin_38166557的博客 124

visio安装包

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

std::find、std::find_if、std::find_if_not 用法

目录std::find std::find 描述:        查找容器中指定元素位置。 定义: template< class InputIt, class T > InputIt find( InputIt first, InputIt last, const T& value ); template< class InputIt, class T > constexpr InputIt find( InputIt first,

滴水穿石的博客 3037

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

std::find, find_if, find_if_not,find_end,find_first_of,adjacent_find

std::find std::find_if std::find_if_not std::find_end std::find_first_of std::adjacent_find

janeqi1987的专栏 1119

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++11标准库算法:深入理解std::find, std::find_if与std::find_if_not

这三个算法的核心目标均为在迭代器范围中查找首个满足特定条件的元素,并返回指向该元素的迭代器(若未找到则返回last三者的关键区别在于判断元素是否满足条件的逻辑std::find:通过operator==判断元素是否等于目标值;:通过一元谓词(UnaryPred)判断元素是否满足条件(返回true:通过一元谓词判断元素是否不满足条件(返回false)——这是C++11新增的算法,解决了此前需通过配合std::not1反转谓词的繁琐问题。算法适用场景优势典型示例std::find。

码事漫谈 932

C++ STL标准库:算法<algorithm> 查找算法 find() find_if()

#include <functional> #include <iostream> #include <vector> #include <algorithm> using namespace std; template <class T> void FillValue(T& vect, int first, int last) { if (last >= first) { for (int i = first; i &l

超级大洋葱的博客 3581

c++ find, find_if查找元素

std::find:     查找容器元素, find只能查找容器元素为     [cpp] view plaincopy #include    #include    #include    int main()   {       std::vectorint> v;       for (int i = 0; i    

a11123939的专栏 2304

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

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

u012719076的博客 1169
上一篇: UDP报文的覆盖/重叠问题
下一篇: 浮点数/float/double 是否需要考虑网络字节序的问题
codelast.com
博客等级 码龄21年 92粉丝 97原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值