当前位置:   article > 正文

C++ STL find与find_if的使用_c++ find_if

c++ find_if

一、find函数

STL的find函数提供了一种对数组、STL容器内的元素进行查找的方法。使用该函数,需要加上#include <algorithm>。

函数原型:

  1. template<class InputIterator, class T>
  2. InputIterator find (InputIterator first, InputIterator last, const T& val)
  3. {
  4. while (first!=last) {
  5. if (*first==val) return first;
  6. ++first;
  7. }
  8. return last;
  9. }

该函数返回一个迭代器到范围[first,last)中等于val的第一个元素。如果没有找到这样的元素,函数将返回last。函数使用运算符==将各个元素与val进行比较。

参数:first,last:
将迭代器输入到序列的初始和最终位置。搜索的范围是[first,last],它包含first和last之间的所有元素,包括first指向的元素,而不是last指向的元素。

val:要在范围中搜索的值。

T应为支持与InputIterator使用运算符==(元素为左侧操作数,val为右侧操作数)的元素进行比较的类型。

返回值:等于val的范围中第一个元素的迭代器。

1.1 内置类型的查找

如果是C++内置的类型,比如int,double,string等,直接使用就行了

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. int main()
  6. {
  7. vector<int> nums;
  8. nums.push_back(10);
  9. nums.push_back(20);
  10. nums.push_back(30);
  11. vector<int>::iterator it = find(nums.begin(), nums.end(), 10); // 查找vector中是否有元素“10”
  12. if (it != nums.end()) // 找到了
  13. {
  14. cout << *it << endl;// do something
  15. }
  16. else // 没找到
  17. {
  18. cout << "not find" << endl;// do something
  19. }
  20. system("pause");
  21. return 0;
  22. }

1.2 自定义类的查找

 如果是自定义类型,比如自定义的一个CPerson类,那么如何用find()函数进行查找呢?这时,我们需要提供一个判断两个CPerson对象“相等”的定义,find()函数才能从一个list中找到与指定的CPerson“相等”的元素。
      这个“相等”的定义,是通过重载“==”操作符实现的,我们在CPerson类中添加一个方法,定义为:
       bool operator==(const CPerson &rhs) const;

这样就可以进行查找了

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <list>
  4. using namespace std;
  5. class CPerson
  6. {
  7. public:
  8. CPerson(void) {};
  9. CPerson(int age):m_age(age)
  10. {
  11. };
  12. ~CPerson(void) {};
  13. bool operator==(const CPerson &rhs) const
  14. {
  15. return (m_age == rhs.m_age);
  16. }
  17. CPerson(const CPerson & c)
  18. {
  19. m_age = c.m_age;
  20. }
  21. public:
  22. int m_age; // 年龄
  23. };
  24. int main()
  25. {
  26. list<CPerson> lst;
  27. CPerson *temp1 = new CPerson(10);
  28. CPerson *temp2 = new CPerson(20);
  29. CPerson *temp3 = new CPerson(50);
  30. lst.push_back(*temp1);// 向lst中添加元素
  31. lst.push_back(*temp2);
  32. lst.push_back(*temp3);
  33. CPerson cp_to_find; // 要查找的对象
  34. cp_to_find.m_age = 20;
  35. list<CPerson>::iterator it = find(lst.begin(), lst.end(), cp_to_find); // 查找list中是否有
  36. if (it != lst.end()) // 找到了
  37. {
  38. cout << (*it).m_age << endl;// do something
  39. }
  40. else // 没找到
  41. {
  42. cout << "not find" << endl;// do something
  43. }
  44. system("pause");
  45. return 0;
  46. }

打印

二、find_if函数

find_if函数 带条件的查找元素,可以通过find_if函数来实现查找满足特定条件的元素。find_if函数依次的遍历容器的元素,返回第一个使函数为true的元素的迭代器,如果查找失败则返回end迭代器。它与find函数的区别就是不用重写==,而是自己定义查找条件。

函数原型

  1. template<class InputIterator, class UnaryPredicate>
  2. InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
  3. {
  4. while (first!=last) {
  5. if (pred(*first)) return first;
  6. ++first;
  7. }
  8. return last;
  9. }

查找map键值对,使用仿函数

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <map>
  5. class map_value_finder
  6. {
  7. public:
  8. map_value_finder(const std::string &cmp_string) :m_s_cmp_string(cmp_string) {}
  9. bool operator ()(const std::map<int, std::string>::value_type &pair) // 仿函数
  10. {
  11. return pair.second == m_s_cmp_string;
  12. }
  13. private:
  14. const std::string &m_s_cmp_string;
  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. std::map<int, std::string>::iterator it = my_map.end();
  24. it = std::find_if(my_map.begin(), my_map.end(), map_value_finder("English"));
  25. if (it == my_map.end()) {
  26. printf("not found\n");
  27. }
  28. else {
  29. printf("found key:%d value:%s\n", it->first, it->second.c_str());
  30. }
  31. return 0;
  32. }

打印

 查找结构体,使用lamda表达式

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. typedef struct testStruct
  5. {
  6. int a;
  7. int b;
  8. };
  9. int main()
  10. {
  11. vector<testStruct> testStructVector = { {3,3},{0,2} };
  12. auto itrFind = find_if(testStructVector.begin(), testStructVector.end(), [](testStruct myStruct) {
  13. return myStruct.a > 2 && myStruct.b < 8;
  14. });
  15. if (itrFind != testStructVector.end()) {
  16. cout << "found!";
  17. }
  18. else {
  19. cout << "not found!";
  20. }
  21. return 0;
  22. }

查找自定义的类 ,使用普通的bool全局函数

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <list>
  4. using namespace std;
  5. class CPerson
  6. {
  7. public:
  8. CPerson(void) {};
  9. CPerson(int age):m_age(age)
  10. {
  11. };
  12. ~CPerson(void) {};
  13. bool operator==(const CPerson &rhs) const
  14. {
  15. return (m_age == rhs.m_age);
  16. }
  17. CPerson(const CPerson & c)
  18. {
  19. m_age = c.m_age;
  20. }
  21. public:
  22. int m_age; // 年龄
  23. };
  24. //自定义的find函数,要求age=10
  25. bool Equal_10(CPerson &rhs) {
  26. return (rhs.m_age == 10);
  27. }
  28. int main()
  29. {
  30. list<CPerson> lst;
  31. CPerson *temp1 = new CPerson(30);
  32. CPerson *temp2 = new CPerson(20);
  33. CPerson *temp3 = new CPerson(50);
  34. lst.push_back(*temp1);// 向lst中添加元素
  35. lst.push_back(*temp2);
  36. lst.push_back(*temp3);
  37. CPerson cp_to_find; // 要查找的对象
  38. cp_to_find.m_age = 20;
  39. list<CPerson>::iterator it = find_if(lst.begin(), lst.end(), Equal_10); // 查找list中是否有
  40. if (it != lst.end()) // 找到了
  41. {
  42. cout << (*it).m_age << endl;// do something
  43. }
  44. else // 没找到
  45. {
  46. cout << "not find" << endl;// do something
  47. }
  48. return 0;
  49. }

打印

 参考:

find_if - C++ Reference

find - C++ Reference

C++11 find和find_if的用法_zzhongcy的博客-CSDN博客_find_if

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/507711
推荐阅读
相关标签
  

闽ICP备14008679号