加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

C++ find_if 和find_if_not 函数用法详解

发布时间:2022-07-18 06:29:23 所属栏目:语言 来源:互联网
导读:继《C++ find()函数》一节后,本节再讲解 2 个和 find() 功能类似的函数,分别为 find_if() 函数和 find_if_not() 函数。 值得一提的是,find_if() 和 find_if_not() 函数都定义在algorithm头文件中。因此在使用它们之前,程序中要先引入此头文件: #inclu
  继《C++ find()函数》一节后,本节再讲解 2 个和 find() 功能类似的函数,分别为 find_if() 函数和 find_if_not() 函数。
 
  值得一提的是,find_if() 和 find_if_not() 函数都定义在<algorithm>头文件中。因此在使用它们之前,程序中要先引入此头文件:
  #include <algorithm>
  C++ find_if()函数
  和 find() 函数相同,find_if() 函数也用于在指定区域内执行查找操作。不同的是,前者需要明确指定要查找的元素的值,而后者则允许自定义查找规则。
 
  所谓自定义查找规则,实际上指的是有一个形参且返回值类型为 bool 的函数。值得一提的是,该函数可以是一个普通函数(又称为一元谓词函数),比如:
  bool mycomp(int i) {
    return ((i%2)==1);
  }
  上面的 mycomp() 就是一个一元谓词函数,其可用来判断一个整数是奇数还是偶数。
  如果读者想更深层次地了解 C++ 谓词函数,可阅读《C++谓词函数》一节。
 
  也可以是一个函数对象,比如:
  //以函数对象的形式定义一个 find_if() 函数的查找规则
  class mycomp2 {
  public:
      bool operator()(const int& i) {
          return ((i % 2) == 1);
      }
  };
  此函数对象的功能和 mycomp() 函数一样。
 
  确切地说,find_if() 函数会根据指定的查找规则,在指定区域内查找第一个符合该函数要求(使函数返回 true)的元素。
 
  find_if() 函数的语法格式如下:
  InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);
 
  其中,first 和 last 都为输入迭代器,其组合 [first, last) 用于指定要查找的区域;pred 用于自定义查找规则。
  值得一提的是,由于 first 和 last 都为输入迭代器,意味着该函数适用于所有的序列式容器。甚至当采用适当的谓词函数时,该函数还适用于所有的关联式容器(包括哈希容器)。
 
  同时,该函数会返回一个输入迭代器,当查找成功时,该迭代器指向的是第一个符合查找规则的元素;反之,如果 find_if() 函数查找失败,则该迭代器的指向和 last 迭代器相同。
 
  举个例子:
  #include <iostream>     // std::cout
  #include <algorithm>    // std::find_if
  #include <vector>       // std::vector
  using namespace std;
  //自定义一元谓词函数
  bool mycomp(int i) {
      return ((i % 2) == 1);
  }
  //以函数对象的形式定义一个 find_if() 函数的查找规则
  class mycomp2 {
  public:
      bool operator()(const int& i) {
          return ((i % 2) == 1);
      }
  };
  int main() {
      vector<int> myvector{ 4,2,3,1,5 };
      //调用 find_if() 函数,并以 IsOdd() 一元谓词函数作为查找规则
      vector<int>::iterator it = find_if(myvector.begin(), myvector.end(), mycomp2());
      cout << "*it = " << *it;
      return 0;
  }
  程序执行结果为:
  *it = 3
 
  结合程序执行结果不难看出,对于 myvector 容器中的元素 4 和 2 来说,它们都无法使 (i%2)==1 这个表达式成立,因此 mycomp2() 返回 false;而对于元素 3 来说,它可以使 mycomp2() 函数返回 true,因此,find_if() 函数找到的第一个元素就是元素 3。
 
  值得一提的是,C++ STL find_if()官网给出了 find_if() 函数底层实现的参考代码(如下所示),感兴趣的读者可自行分析,这里不做过多描述:
  template<class InputIterator, class UnaryPredicate>
  InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
  {
      while (first!=last) {
          if (pred(*first)) return first;
          ++first;
      }
      return last;
  }
  C++ find_if_not()函数
  find_if_not() 函数和 find_if() 函数的功能恰好相反,通过上面的学习我们知道,find_if() 函数用于查找符合谓词函数规则的第一个元素,而 find_if_not() 函数则用于查找第一个不符合谓词函数规则的元素。
 
  find_if_not() 函数的语法规则如下所示:
  InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);
 
  其中,first 和 last 都为输入迭代器,[first, last) 用于指定查找范围;pred 用于自定义查找规则。
  和 find_if() 函数一样,find_if_not() 函数也适用于所有的容器,包括所有序列式容器和关联式容器。
 
  同样,该函数也会返回一个输入迭代器,当 find_if_not() 函数查找成功时,该迭代器指向的是查找到的那个元素;反之,如果查找失败,该迭代器的指向和 last 迭代器相同。
 
  举个例子:
  #include <iostream>     // std::cout
  #include <algorithm>    // std::find_if_not
  #include <vector>       // std::vector
  using namespace std;
  //自定义一元谓词函数
  bool mycomp(int i) {
      return ((i % 2) == 1);
  }
  int main() {
      vector<int> myvector{4,2,3,1,5};
      //调用 find_if() 函数,并以 mycomp() 一元谓词函数作为查找规则
      vector<int>::iterator it = find_if_not(myvector.begin(), myvector.end(), mycomp);
      cout << "*it = " << *it;
      return 0;
  }
  程序执行结果为:
  *it = 4
 
  可以看到,由于第一个元素 4 就不符合 (i%2)==1,因此 find_if_not() 成功找到符合条件的元素,并返回一个指向该元素的迭代器。
 
  find_if_not() 函数的底层实现和 find_if() 函数非常类似,C++ STL find_if_not()官网给出了该函数底层实现的参考代码,感兴趣的读者可自行分析,这里不做过多描述:
  纯文本复制
  template<class InputIterator, class UnaryPredicate>
  InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred)
  {
      while (first!=last) {
          if (!pred(*first)) return first;
          ++first;
      }
      return last;
  }

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读