这是find()的一个更强大的版本。这个例子演示了find_if(),它接收一个函数对象的参数作为参数, 并使用它来做更复杂的评价对象是否和给出的查找条件相付。
假设我们的list中有一些按年代排列的包含了事件和日期的记录。我们希望找出发生在1997年的事件。

代码如下:

//----------------------------------------------------------------------------------------
//      Desc:       STL_find_if()_How to find things in an STL list MkII
//      Author:     pigfly
//      Data:       2010.12.01
//      Copyright (C) 2010 pigfly
//----------------------------------------------------------------------------------------#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 EventRecordreturn EventRecord.substr(11,4)=="1997";//return this->substr(11,4)=="1997"}
};int main (void) {list<string> Events;// string positions 0123456789012345678901234567890123456789012345Events.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()函数查找过程中的是否匹配!

=========================================

注意一下,上面的find_if没有参数,来个带参数的例子,贴出关键代码,

std::list<ClientItem*> m_pclientitemlist;          //客户端列表
class EventIfExistSock
{
public:EventIfExistSock(const int pdevid) :m_devid(pdevid){}bool operator () (ClientItem* pci){return pci->clientid == m_devid;}
private:int m_devid;
};std::list<ClientItem*>::iterator sockitemiter = find_if(m_pclientitemlist.begin(), m_pclientitemlist.end(), EventIfExistSock(1001));
bool online = iter != DeviceManager::GetInstance()->GetDeviceList().end() ? true : false;

STL中的find_if函数相关推荐

  1. C++STL中的unique函数解析

    一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即"删除"序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的 ...

  2. c++STL中的find()函数 有两种使用方法

    c++STL中的find()函数 有两种使用方法 方法一: 开头引头文件:中的函数 其调用形式为 find(start,end,value) start搜寻的起点,end搜寻的终点,要寻找的value ...

  3. STL中的unique函数

    unique是STL中一个比较实用而且非常常用的函数之一了: 作用就是容器或数组去重,但是并不是完全的去重:它只是把重复的元素放在了容器的后面,而且去重前一定要先排序: 头文件:#include< ...

  4. STL中的for_each()函数

    for_each()函数是C++ STL中的一个遍历函数,函数原型如下: for_each(InputIterator first, InputIterator last, Function func ...

  5. c语言asinh函数,C ++ STL中的asinh()函数

    该asinh()函数返回弧度的双曲正弦或反双曲正弦.它是C ++ STL中的内置函数. 该asinh()函数的语法如下.asinh(var) 从语法可以看出,该函数asinh()接受数据类型为floa ...

  6. c语言exp2是什么函数,C ++ STL中的exp2()函数

    在本文中,我们将讨论C ++ STL中用于复数的std::exp2()函数的工作,语法和示例. 什么是std::exp2()? 用于复数的std::exp2()函数是C ++ STL中的内置函数,该函 ...

  7. c语言tanh函数,C ++ STL中的tanh()函数

    该tanh()函数返回以弧度给出的角度的双曲正切值.它是C ++ STL中的内置函数. 该tanh()函数的语法如下.tanh(var) 从语法可以看出,该函数tanh()接受数据类型为float,d ...

  8. C++11 :STL中的 iota ()函数

    该函数是C++11 才引入,之前版本没有此函数. iota 函数是一个计算机语言中的函数,用于产生连续的值.该函数得名自 APL 语言,其中用来产生从 1 开始的连续数值. 该函数位于头文件#incl ...

  9. 为什么map对象不能使用stl中的sort函数

    STL所提供的各式各样算法中,sort()是最复杂最庞大的一个.这个算法接受两个RandomAccestlerators(随机存取迭代器),然后将区间内的所有元素以渐增方式由小到大重新排列.第二个版本 ...

最新文章

  1. 条款15: 让operator=返回*this的引用
  2. 【python+beautifulsoup4】Python中安装bs4后,pycharm报错ModuleNotFoundError: No module named 'bs4'...
  3. virtualbox硬件加速_VirtualBox 安装Ubuntu虚拟机卡顿 加速方法以及出现的问题
  4. 计算机等级考试模拟题卷子,二级VB模拟试卷 1
  5. LeetCode 1196. 最多可以买到的苹果数量(贪心)
  6. 常人不解朱啸虎,读懂已是被裁人
  7. IDEA编译通过能运行但是出现红色下划线
  8. 《Python游戏趣味编程》 第1章 Python与开发环境介绍
  9. shell 中的export作用(转载)
  10. 8-ORACLE四种关闭方式
  11. HDI与普通PCB的4点主要区别
  12. this和that的几点区别
  13. PDF怎么在线免费转换成WORD,亲测可用
  14. Ubuntu18.04之lightdm取代gdm
  15. 室内定位技术研发简介
  16. c语言读取ascii文件,C++对ASCII文件的读写操作
  17. 力扣242.有效的字母异位词(Java语言,排序法、散列表法)
  18. alertmanager监控告警163邮箱通知
  19. 如何去掉html中input的边框
  20. CAPL基础篇-----CAPL中的定时器操作

热门文章

  1. SpringMVC快速入门-开发步骤
  2. 方法练习1_比较两个数字是否相同
  3. 忘记密码漏洞案例分析
  4. SpringBoot高级-消息-AmqpAdmin管理组件的使用
  5. 网页加载的不同的方式、点击按钮显示一句话、jQuery中获取元素的方法
  6. ubuntu 拷贝文件
  7. [NOI2018]你的名字
  8. 自然语言处理hanlp的入门基础
  9. 解决spring-session升级到2.0.0报错的问题
  10. 解决win10 .net framework 3.5安装失败0x800f081f