C++ 中STL中的for_each()、find_if函数

STL中常见的算法及其应用(一) 在 C++ 的标准模板库(STL)中,find函数是一个非常实用的工具,用于在容器中搜索指定的元素。这个函数提供了一种简单有效的方式来确定某个值是否存在于容器中,以及其位置。std::find是一个非常有用的函数,可以帮助你快速找到容器中的元素。它是一个非修改序列操作,因此不会改变容器中的内容。使用std::find可以有效地搜索任何满足输入迭代器要求的容器,包括数组、链表、向量等。虽然std::find。 阅读详情

与STL对应的有很多算法,《c++ primer》中叫做泛型算法,比如常用的find(),find_if(),accumulate()等,均为泛型算法。以下针对for_each()、find_if函数的使用进行相应的介绍。

目录

for_each()用法

find_if()用法


一、for_each():

for_each的原型声明如下

template Function for_each (InputIterator first,InputIterator last, Function fn)
for_each()也是一个模板函数。(关于模板函数可以参考《c++高级编程》,《c++ template》,这两本书确实是好书。)第一个参数为迭代器的开始位置,第二个参数为迭代器的末位,也就是迭代器最后一位的下一位。第三个参数为一个函数指针,或者函数对象。
#include <map>
#include <string>
#include <utility>
using namespace std;

void printPair(const pair<int,int> & elem)
{
	cout << "fn为函数指针:"<< elem.first << " " << elem.second << endl;
}

class CprintPair
{
public:
	void operator()(const pair<int,int> & elem)
	{
		cout << "fn为函数对象:" << elem.first << " " << elem.second << endl;
	}
};
int main()
{
	map<int,int> myMap;
	myMap.insert(make_pair(1, 10));
	myMap.insert(make_pair(2, 20));
	myMap.insert(make_pair(3, 30));

	for_each(myMap.begin(), myMap.end(), printPair);//fn为函数指针
	for_each(myMap.begin(), myMap.end(), CprintPair());//fn为函数对象
	system("pause");
	return 0;
}

//输出:
//fn为函数指针:1 10
//fn为函数指针:2 20
//fn为函数指针:3 30
//fn为函数对象:1 10
//fn为函数对象:2 20
//fn为函数对象:3 30

二、find_if():接收一个函数对象的参数作为参数, 并使用它来做更复杂的评价对象是否和给出的查找条件相符。

for_if()的原型声明如下:

template<class InputIterator, class Predicate>
  InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred )
  {
    for ( ; first!=last ; first++ ) if ( pred(*first) ) break;
    return first;
  }

在区间[first,end)中搜寻使一元判断式pred为true的第一个元素,如果没找到,返回end。

1)假设我们的list中有一些按年代排列的包含了事件和日期的记录。我们希望找出发生在1997年的事件。

代码如下:

#include <iostream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;

class EventIsIn1997 {
public: 
	bool operator () (string& EventRecord) {
		// year field is at position 12 for 4 characters in EventRecord
		return EventRecord.substr(11,4)=="1997";
		//return this->substr(11,4)=="1997"
	}
};

int main (void) {
	list<string> Events;

	// string positions 0123456789012345678901234567890123456789012345
	Events.push_back("07 January 1995 Draft plan of house prepared");
	Events.push_back("07 February 1996 Detailed plan of house prepared");
	Events.push_back("10 January 1997 Client agrees to job");
	Events.push_back("15 January 1997 Builder starts work on bedroom");
	Events.push_back("30 April 1997 Builder finishes work");

	list<string>::iterator EventIterator = find_if (Events.begin(), Events.end(), EventIsIn1997());

	// find_if completes the first time EventIsIn1997()() returns true
	// for any object. It returns an iterator to that object which we
	// can dereference to get the object, or if EventIsIn1997()() never
	// returned true, find_if returns end()
	if (EventIterator==Events.end()) {
		cout << "Event not found in list" << endl;
	}
	else {
		cout << *EventIterator << endl;
	}
}

//输出:
//10 January 1997 Client agrees to job

注意,find_if()的第三个参数是EventIsIn1997(),它是个仿函数,接收一个string对象,在运算符()的内部定义我所要的查找条件,本例的查找条件是:EventRecord.substr(11,4)=="1997",注意,这里的仿函数返回类型必须是bool类型,这客观反应在find_if()函数查找过程中的是否匹配!

2)数据类型是自定义的结构体的查找过程:

代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

struct value_t
{
	int a;
	int b;
};

class vector_finder
{
public:
	vector_finder( const int a, const int b ) :m_v_a(a),m_v_b(b){}
	bool operator ()( vector<struct value_t>::value_type &value)
	{
		return (value.a==m_v_a)&&(value.b = m_v_b);
	}
private:
	int m_v_a;
	int m_v_b;
};

int main()
{
	vector<value_t> my_vector;
	value_t my_value;

	my_value.a = 11; my_value.b = 1001;
	my_vector.push_back(my_value);

	my_value.a = 12; my_value.b = 1002;
	my_vector.push_back(my_value);

	my_value.a = 13; my_value.b = 1003;
	my_vector.push_back(my_value);

	my_value.a = 14; my_value.b = 1004;
	my_vector.push_back(my_value);

	vector<value_t>::iterator it = find_if( my_vector.begin(), my_vector.end(), vector_finder(13,1003));
	if( it == my_vector.end() )
		cout<<"not found!"<<endl;
	else
		cout<<"found value a:"<<(*it).a <<", b:"<<(*it).b<<endl;
	return 0;
}
//输出:
//found value a:13, b:1003

在这里,我们同样构造了一个仿函数,也就是class vector_finder,也就是vector_finder()函数,注意它的结构与我们要查找的结构体之间的关系,我们发现,它们是非常相象的。

这里的重点就在于class vector_finder的构造!

3)在map容器中的应用

代码:

#include <iostream>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

class map_finder
{
public:
	map_finder( string cmp_string ) : m_string(cmp_string) {}
	bool operator () (const map<int,string>::value_type pair)
	{
		return pair.second == m_string;
	}
private:
	string m_string;
};

int main()
{
	map<int ,string> my_map;
	my_map.insert( make_pair(10,"china"));
	my_map.insert( make_pair(20,"usa"));
	my_map.insert( make_pair(30,"english"));
	my_map.insert( make_pair(40,"hongkong"));

	map<int,string>::iterator it = find_if(my_map.begin(),my_map.end(),map_finder("english"));
	if( it == my_map.end() )
		cout<<"not found!"<<endl;
	else
		cout<<"found key:"<<(*it).first<<", value:"<<(*it).second<<endl;
	return 0;
}

//输出:
//found key:30,vlaue:english

 

CPP_STL中的算法 STL中的算法遍历算法for_each()transform()查找算法find()find_if()adjacent_find()binary_search()count()/count_if()排序算法merge()sort()random_shuffle()reverse()拷贝和替换算法copy()replace()/replace_if()swap()生成算法accumulate()fill()集合算法set_intersection()求交集set_union()求并集set_differenc 阅读详情

相关推荐

C++ STL遍历算法:for_each与transform的深度解析与实践指南

在C++编程中,遍历操作是处理容器数据的基础,而标准模板库(STL)提供的算法组件则是实现高效、清晰代码的关键工具。遍历算法的核心原理在于将数据与操作分离,通过迭代器抽象访问容器元素,使得算法能够独立于具体容器类型工作。这种设计带来了显著的技术价值:它提升了代码的泛化能力、可维护性,并为编译器优化和并行化执行提供了可能。在实际应用场景中,无论是简单的元素修改、数据转换,还是复杂的数据处理管道,遍历算法都能发挥重要作用。本文聚焦于STL中最常用的两个遍历算法——for_each和transform,深入探讨它

weixin_30731305的博客 416

【C++编程语言】之STL常用算法之遍历 查找算法 for_each()函数 transform()函数 find()函数 find_if()函数等

1.概述 2.常用遍历算法 2.1 for_each 2.1 transform 3.常用的查找算法 3.1 find 查找元素 ---- 内置数据类型查找和自定义数据类型 3.2 find_if 按照条件查找元素 3.3 adjacent_find 查找相邻重复元素 3.4 binary_search 查找指定元素是否存在 3.5 count 统计元素个数 3.6 count_if 按照条件统计元素个数

kaszxc的博客 988

map按value值查找——find_if的使用(转载)

map按value值查找——find_if的使用(转载) 1 #ifndef _CVALUEFIND_H_ 2 #define _CVALUEFIND_H_ 3 #include <string> 4 #include <algorithm> 5 #include <map> 6 7 8 class map_value_finder...

jacke121的专栏 3790

C++STL中的常用算法

概述: 使用算法记得包含头文件等 是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历、复制、修改等 体积很小,只包括几个在序列上面进行简单数学运算的模板函数 定义了一些模板类,用以声明函数对象 一、常用遍历算法 1、for_each: 实现遍历容器: for_each(iterator beg, iterator end, _func); //分别用普通函数与函数对象来作为第三个参数 //普通函数 void print01(int val) { cout << val &lt

lyxawdn的博客 603

c++STL常用算法之遍历算法与查找算法——全面总结(附案例解析)(二十三)

这里有C++STL——全面总结详细教程(附案例解析)(持续更新中) 目录 STL- 常用算法 常用遍历算法 for_each transform 常用查找算法 find find_if adjacent_find binary_search count count_if STL- 常用算法 概述: 算法主要是由头文件<algorithm> <f...

cfl997 7961

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

weixin_45355881的博客 4708

C++学习笔记——(八)map容器、for_each、预定义函数

注:编码工具是CLion+Cygwin64 目录 map multimap for_each 对象存入后和从容器中取出的细节 预定义函数 map map会对key进行排序。 #include <iostream> using namespace std; // 先导入头文件 #include <map> int main(){ map<int, string> m; // map的集中插入元素的方式 m...

miyuexingchen的专栏 3516

深入解析经典蓝牙连接:从HCI命令到LMP协议的完整流程

本文深入解析经典蓝牙连接的完整流程,从设备发现、寻呼建立物理链路,到安全配对与加密的每一步。通过对照HCI LOG与AIR LOG,详细拆解了HCI命令与LMP协议报文的对应关系,帮助开发者精准定位连接问题,掌握蓝牙调试的核心方法。

weixin_29260291的博客 456

C++——map_2

map按value值查找——find_if的使用 最近是经常使用stl中的map,于是就想记一些关于map的东西。这一篇中会讲到map按照value值查找的方法,就是find_if函数。大家都知道在map中,排序是按照key值排的,map自带的find方法也是按着key值查找的,这在某些情况下可能会遇到一些麻烦。1.先来看看find_if的原型: template <class Input

cpfor 513

数十个锂电池充放电电路,锂电池充放电芯片

关乎锂电池供电的产品,在锂电池上,需要三个电路系统:1,锂电池保护电路,2,锂电池充电电路,3,锂电池输出电路。 内容目录: 单节的锂电池保护电路单节为3.7V锂电池(也叫4.2V)和3.8V锂电池(也叫4.35V) 单节的锂电池充电电路即锂电池保护板 单节的锂电池输出电路锂电池转换稳压输出为:1.2V,3.3V,5V,12V等等 两节的锂电池保护电路两节串联7.4V锂电池(也叫8.4V) 两节的锂电池充电电路即两节锂电池保护板 两节...

kuakewei123的博客 1万+

OpenClaw Browser Relay Extension 鉴权失败与 invalid handshake 问题的终极解决方案

在使用 OpenClaw 浏览器插件 (Browser Relay Extension) 时,许多用户可能会遇到两个主要问题:一是配置端口错误导致的连接失败,二是鉴权失败 (Gateway token rejected)。本文将详细解析这两个问题并提供解决方案。

gerryke的blog 5559

常用的算法函数

几个概念 一元函数:函数的参数只有一个 一元断言(谓词):一元的函数返回类型是bool 二元函数:函数的参数只有两个 二元断言(谓词):二元的函数返回类型是bool 1、for_each() void print(int &number)//一元函数 { ++number; cout << number << " "; } void test() { vector<int> numberVec = {1, 3, 5, 7.

qq_43496435的博客 533

银河麒麟系统下VSCode安装全攻略:从下载到桌面快捷方式(附常见问题解决)

本文详细介绍了在银河麒麟系统下安装和优化VSCode的全流程,包括环境准备、安装策略、权限管理、桌面快捷方式创建以及系统级性能调优。特别针对国产系统环境提供了常见问题解决方案和必备插件推荐,帮助开发者高效配置开发环境。

v6b7n8m9q0的博客 1134

【 C++基础】algorithm 库常用函数

algorithm 头文件常用函数<1>序列容器遍历操作for_eachfindfind_ifequalcountreplacereplace_if 本文介绍 C++ 的 algorithm 库中常用函数。algorithm是C++标准程序库中的一个头文件,定义了C++ STL标准中的基础性的算法(均为函数模板)。定义了设计用于元素范围的函数集合。任何对象序列的范围可以通过迭代器或指针访问。 <1>序列容器遍历操作 常用参数对照: frist : 起点,为一个迭代器 last :

流水猿的博客 3万+

TSMC65nm工艺下Virtuoso仿真gm-id曲线的保姆级教程(含ADE设置详解)

本文提供了一份在TSMC 65nm工艺下使用Cadence Virtuoso绘制gm-id曲线的详细教程。内容涵盖从理解gm/id方法学、搭建仿真环境、深度解析ADE设置,到运行DC仿真、提取数据并生成对数坐标曲线的完整流程。教程重点解析了Virtuoso ADE中的关键设置与常见避坑点,旨在帮助模拟集成电路设计初学者快速掌握这一核心设计工具,为高性能电路设计奠定基础。

grpc6streamer的博客 1174

安装升级最新版本postman时遇到“无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上.”的问题

软件版本迭代更新真快,最近升级最新Postman版本时出现以下问题 我就简单纪录下解决办法: 备注:我用的是最新的postman工具包:Postman-win64-7.25.0-Setup.exe,目前是最新 0. 前提是已经到postman官网https://www.postman.com/downloads/下载好软件工具包 1.安装window7系统更新补丁KB2533623,请到微软公司官网https://support.microsoft.com/en-us/help/2...

董广明的博客 1万+

STL之for_each, cout, cout_if, find, find_if

STL之for_each, cout, cout_if, find_if

bigfacesafdasgfewgf 838

知识蒸馏⚗️ | YOLOv5知识蒸馏实战篇

YOLOv5知识蒸馏教程

Coding... 9361

STL for_each,find_if用法

C/C++ codetemplateclass InputIterator, class Function> Function for_each(InputIterator first, InputIterator last, Function f) { for ( ; first!=last; ++first ) f(*first); return f;

oathevil的专栏 1258

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

(STL)for_each、find_if用法

/---------------------------------------for_each-----------------------------------#include #include #include using namespace std;struct print{ int count; print(){count = 0;} void operator()(int

PicLab 2139

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【C/C++】从API学习STL algorithm 001(for_each、find、find_if、find_end、find_first_of 快到碗里来(◕ᴗ◕✿)

algorithm是STL头文件中最大的一个,其中常用到的功能涉及到比较、交换、查找、遍历、复制、修改、反转、排序、合并等。使用algorithm中的算法需要【#include 】

BigXMeng的博客 346

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【STL十八】算法——不修改序列的操作(for_each、count、find、equal、search)

算法——不修改序列的操作(for_each、count、find、equal、search)

junxuezheng的博客 781

C++高阶-STL之容器元素的查找与遍历

用 for_each()算法遍历容器中的数据元素 for_each()算法的意义,不仅仅是遍历容器中的每一个数据元素,更重要的意义在于,它在遍历容器中的每一个数据元素的同时,可以将某个操作应用到它访问的每一个数据元素上,从而直接实现对容器中大量元素的处理。同时,这个操作是可替换的,这就增加了处理数据的灵活性。 Function for_each (InputIterator first, InputIterator last, Function f); for_each()算法可以接受三个参数,前两个通常

AndyJ的学习之旅 2938

C++ 算法包(find/find_if,for_each,transform,count/count_if,merge,sort,copy,replace)简单使用

C++算法包 find/find_if,for_each,transform,count/count_if,merge,sort,copy,replace find和 find_if查找容器元素for_each 用来遍历元素transform (修改容器内的元素)count 和 count_if 统计容器内某一个元素的值merge 合并容器sort 容器排序copy 容器拷贝replace 替换容器内的某一个元素 接上一篇 STL 包 记得添加算法包依赖哦~ //算法包依赖 #include <alg

高级开发者进阶ing... QaQ 580

C++提高笔记(六)---STL函数对象、STL常用算法(遍历、查找)

C++提高笔记---STL函数对象(仿函数)、STL常用算法(遍历、查找)

m0_46359434的博客 1434

C++ STL常用算法 for_each sort find set

目录 STL 常用算法 常用遍历算法 for_each transform 常用查找算法 find find_if adjacent_find binary_search count count_if STL 常用算法 算法主要是由头文件<algorithm> <functional> <numeric> 组成。 <algo...

damonlearning的博客 539
上一篇: C++STL中sort(),unique(),unique_copy()的使用
下一篇: C++中stable_sort和sort的区别
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值