STL中的find_if函数
上一篇文章也讲过,find()函数只能处理简单类型的内容,也就是缺省类型,如果你想用一个自定义类型的数据作为查找依据则会出错!这里将讲述另外一个函数find_if()的用法
这是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 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()函数查找过程中的是否匹配!
下面我们在看看,数据类型是自定义的结构体的查找过程:
代码:
- //----------------------------------------------------------------------------------------
- // Desc: STL_find_if() used in vector container, struct data
- // Author: pigfly
- // Data: 2010.12.01
- // Copyright (C) 2010 pigfly
- //----------------------------------------------------------------------------------------
- #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的构造!
下面再看看,在map容器中的应用:
代码
- //----------------------------------------------------------------------------------------
- // Desc: STL_find_if() used in map container, string data
- // Author: pigfly
- // Data: 2010.12.01
- // Copyright (C) 2010 pigfly
- //----------------------------------------------------------------------------------------
- #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
由于这里只是讲究一下find_if()的用法,没有去关心它的细节,如果希望了解更多,比如仿函数的模板原形,甚至整个STL
STL中的find_if函数的更多相关文章
- C++STL中的unique函数解析
一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即”删除”序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情 ...
- c++中STL中的next_permutation函数基本用法
对于next_permutation函数是针对于排列组合问题的库函数,它的排序方式是按照字典的方式排列的·: 如以下代码对于next_permutation函数的初步解释: #include<c ...
- 为什么map对象不能使用stl中的sort函数
STL所提供的各式各样算法中,sort()是最复杂最庞大的一个.这个算法接受两个RandomAccestlerators(随机存取迭代器),然后将区间内的所有元素以渐增方式由小到大重新排列.第二个版本 ...
- C++STL中的unique函数
头文件:#include<iostream> 函数原型:iterator unique(iterator it_1,iterator it_2); 作用:元素去重,即”删除”序列中所有相邻 ...
- stl中的for_each() 函数的注意事项
#include<iostream> using namespace std; #include"vector" #include"algorithm&quo ...
- 「STL中的常用函数 容器」
占个坑,下午在更 二分操作:lower_bound和upper_bound 存图/数列操作:vector容器 全排列:next_permutation和prev_permutation 字符串转数列: ...
- STL中一些函数的应用
1.nth_element():找到第几大的数.用法:nth_element(a,a+k,a+n),返回一个数组a中第k大的数,时间复杂度比较小,头文件#include <algorithm&g ...
- STL中的所有算法(70个)
STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...
- STL中的算法
STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baidu.com/ding ...
随机推荐
- 新手对css的浅识
对于css的一个初步理解与认识 在最近的学习中接触到了之前自己从来都不曾想过的语言,C语言,html超文本标记语言等等,还有今天在这里我要进行分析的css,之前浏览过很多的网页,也曾想过这里面的秘密, ...
- idea 多模块项目依赖父工程class找不到问题
比如,我们有这么个过程,项目结构如下: a --b --c a是总结点,b是子节点,c是父节点 b依赖父节点class,通过maven构建时通常我们会在子节点中添加父节点依赖,如: <depen ...
- HBase 学习之一 <<HBase使用客户端API动态创建Hbase数据表并在Hbase下导出执行>>
HBase使用客户端API动态创建Hbase数据表并在Hbase下导出执行 ----首先感谢网络能够给我提供一个开放的学习平台,如果没有网上的技术爱好者提供 ...
- 初涉JavaScript模式 (8) : 函数 【概述】
什么是函数 函数,是一个大型程序中的某部份代码,由一个或多个语句块组成.它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性.(维基百科) 函数的特点 第一类对象 在JavaScript世界中 ...
- javascript权威指南学习笔记2
Javascript语言核心(2~12章) 第三章:类型.值.变量 1.数字: overflow(Infinity, -Infinity).underflow(+0,-0) 非数字值:它和任何值都不相 ...
- JQuery中$.ajax()方法参数
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...
- The Managed Metadata Service or Connection is currently not available
Does the following error message looks familiar to you? when you go to site Actions -> Site Sett ...
- readn、write、readline
字节流套接字上的read和write函数所表现的行为不同于通常的文件IO 字节流套接字上调用read或write输入或输出的字节数可能比请求的数量少,然而这不是出错的状态 这个现象的原因在于内核中用于 ...
- sock_ntop等函数
inet_ntop的一个基本问题是:它要求调用者传递一个指向某个二进制地址的指针, 而该地址通常包含在一个套接字地址结构中,这就要求调用者必须知道这个结构的格式和地址簇, 为了使用这个函数,我们必须为 ...
- JS之路——数组对象
String字符串对象 concat() 返回一个由两个数组合并组成的新数组 join() 返回一个由数组中的所有元素连接在一起的String对象 pop() 删除数组中最后一个元素 并返回该值 pu ...