有时我们要在map、vector容器中查找符合条件的记录,map提供一个find的成员函数,但也仅限于查找关键字满足条件的记录,不支持值域的比较。如果我们要在值域中查找记录,该函数就无能无力了。而vector甚至连这样的成员函数都没有提供。所以一般情况下进行值域的查找,要么自己遍历数据,要么求助于STL的find_if函数。前种方法我们这里就不赘述了,只讲find_if函数。

1 -- find_if的STL定义

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

find_if是一个模板函数,接受两个数据类型:InputItearator迭代器,Predicate用于比较数值的函数或者函数对象(仿函数)。find_if对迭代器要求很低,只需要它支持自增操作即可。当前遍历到的记录符合条件与否,判断标准就是使得pred()为真。至此可能还有些不是很明了,下面举几个例子实际操练下的它的用法。

2 -- find_if在std::map查找时的应用

假如我们有个map对象是这么声明的:

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

插入值后我们想得到值为”english”的这条记录,要怎样写程序呢?下面是个范例参考下:

#include <map>
#include <string>
 
class map_finder
{
public:
       map_finder(const std::string &cmp_string):m_s_cmp_string(cmp_string){}
       bool operator ()(const std::map<int, std::string>::value_type &pair)
       {
10              return pair.second == m_s_cmp_string;
11         }
12  private:
13          const std::string &m_s_cmp_string;                    
14  };
15   
16  int main()
17  {
18      std::map<int, std::string> my_map;
19      my_map.insert(std::make_pair(10, "china"));
20      my_map.insert(std::make_pair(20, "usa"));
21      my_map.insert(std::make_pair(30, "english"));
22      my_map.insert(std::make_pair(40, "hongkong"));    
23      
24      std::map<int, std::string>::iterator it = my_map.end();
25      it = std::find_if(my_map.begin(), my_map.end(), map_finder("english"));
26      if (it == my_map.end())
27         printf("not found\n");       
28      else
29         printf("found key:%d value:%s\n", it->first, it->second.c_str());
30         
31      return 0;        
32  }

class map_finder即用于比较的函数对象,它的核心就是重载的()运算符。因为每个容器迭代器的*运算符得到的结果都是该容器的value_type值,所以该运算符的形参就是map迭代器指向的value_type类型的引用。而map的value_type到底是什么类型,就得看下STL的源代码是如何定义的。

template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>
class map
{
public:
typedef Key key_type;
typedef pair<const Key, T> value_type;
......
};

从上面的定义可以看出,map的value_type是std::pair<const Key, t>类型,它的first值就是关键字,second值保存map的值域。

3 -- find_if在std::vector的应用

vector的find_if用法与map的很相似,区别仅仅是二者的value_type不一样而已。我们看下vecotr对value_type的定义。

template <class T, class Alloc = alloc>
class vector
{
public:
typedef T value_type;
typedef value_type* iterator;
......
};

可以看出vector的value_type就是容器的值类型,了解了这点,我们做个vector的find_if示范。

#include <vector>
#include <string>
 
struct value_t
{
    int a;
    int b;
};
 
10  class vector_finder
11  {
12  public:
13      vector_finder(const int a):m_i_a(a){}
14      bool operator ()(const std::vector<struct value_t>::value_type &value)
15      {
16          return value.a == m_i_a;
17      }
18  private:
19      int m_i_a;                    
20  };
21   
22   
23  int main()
24  {
25      std::vector<struct value_t> my_vector;
26      struct value_t my_value;
27     
28      my_value.a = 11; my_value.b = 1000;
29      my_vector.push_back(my_value);
30      
31      my_value.a = 12; my_value.b = 1000;
32      my_vector.push_back(my_value);
33   
34      my_value.a = 13; my_value.b = 1000;
35      my_vector.push_back(my_value);
36   
37      my_value.a = 14; my_value.b = 1000;
38      my_vector.push_back(my_value);
39      
40      std::vector<struct value_t>::iterator it = my_vector.end();
41      it = std::find_if(my_vector.begin(), my_vector.end(), vector_finder(13));
42      if (it == my_vector.end())
43         printf("not found\n");       
44      else
45         printf("found value.a:%d value.b:%d\n", it->a, it->b);
46         
47      getchar();
48      return 0;        
49  }

转载于:https://www.cnblogs.com/motadou/archive/2009/02/01/1561549.html

stl.find_if用法总结相关推荐

  1. boost::hana::find_if用法的测试程序

    boost::hana::find_if用法的测试程序 实现功能 C++实现代码 实现功能 boost::hana::find_if用法的测试程序 C++实现代码 #include <boost ...

  2. boost::fusion::find_if用法的测试程序

    boost::fusion::find_if用法的测试程序 实现功能 C++实现代码 实现功能 boost::fusion::find_if用法的测试程序 C++实现代码 #include <b ...

  3. 顺序容器STL::list用法

    C++ Code: // 顺序容器STL::list用法 #include<iostream> #include <stdio.h> #include <stdlib.h ...

  4. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  5. find和find_if用法

    一.find的用法 STL容器中有很多find,比如说set,map.他们内部都有内置的find函数,一般情况下,如果我们用到这些容器,那么我们直接用它的内置find就可以了.(这是因为map和set ...

  6. STL bitset用法总结

    c++ bitset类用法:http://blog.csdn.net/qll125596718/article/details/6901935 C++ 参考:http://www.cplusplus. ...

  7. STL MAP用法详解

    暂时未找到原创作者,望知情人士告知,谢过. 第一转贴:http://blog.csdn.net/nwf5d/archive/2009/07/10/4338872.aspx 说明:如果你具备一定的C++ ...

  8. 0.总也记不住的考场or竞赛必备stl各种用法及其他技巧

    写在前面: 以下均以c++为例,个别是C,部分通用. 这个文章是写给自己方便回忆看的,本人也尽量让笔记整洁有条理,觉得写得不好直接×掉即可 欢迎交流 目录 0. 万能头文件(实际上很多复试不可以用): ...

  9. 用法 stl_51Nod 2160 数字游戏 STL基本用法

    目录 目录 1. 题目描述 1.1. Limit 1.2. Problem Description 1.3. Input 1.4. Output 1.5. Sample Input 1.6. Samp ...

最新文章

  1. pyspark DataFrame 转RDD
  2. 第二次启用httpd24调用mysql时出现的错误
  3. 迟到的年度总结,我们应该收放自如
  4. 中考英语听说计算机考试满分,中考英语听说机考在即,这些考生可免试计满分...
  5. java arraylist add时默认调用tostring_从一道例题谈Arrays.toString()与其他String的转换方法...
  6. Leaning perl 第2章练习题答案
  7. 计算机信息安全工程师教材,第二级 系统审计保护级-信息安全工程师教材
  8. ssm员工考勤签到请假管理系统 idea maven
  9. 三菱a系列motion软体_三菱各类伺服电机标准参数一览表
  10. 美国交通信号配时实践经验
  11. python base_Python base(一)
  12. Qt实现的简单记账本软件
  13. IDEA启动tomcat找不到应用程序(localhost:8080)
  14. IT项目经理前景及优劣势分析
  15. 打印选课学生名单(25)
  16. 电磁兼容(EMC):工程师必备之硬件EMC设计规范
  17. 非华为电脑多屏协同_苹果转华为后的真香体验1-非华为电脑体验跨屏协同,好用...
  18. 计算机网络笔试面试题目大全
  19. python特别是anaconda环境下安装库时报错需要Microsoft Visual C++ 14.0 or greater is required的终极解决方案
  20. Android蓝牙开发的各种坑

热门文章

  1. 关于Ajax和@RequestBody配合使用的问题
  2. php压缩中文乱码,完美解决PHP中文乱码
  3. 计算机网络实验_中心聚焦|山东省计算机网络重点实验室学术交流会议顺利召开...
  4. mysql 升序_MySQL“自古以来”都有一个神秘的HANDLER命令
  5. python如何安装wordcloud_基于python的wordcloud库的安装方法
  6. 【Flink】Flink kafka Spark 如何实现数据有序性
  7. 80-450-020-原理-索引-索引失效与优化
  8. 95-50-060-java.nio.channels-NIO-NIO之Selector(选择器)
  9. Mac安装Spring Boot CLI
  10. 用例子理解java7内存结构