• 【C++】常用查找算法


    目录

    find

    find_if

    adjacent_find

    binary_search

    count

    count_if


    查找算法简介

    • find                       查找算法
    • find_if                   按条件查找算法
    • adjacent_find       查找相邻重复元素
    • binary_search      二分查找法
    • count                    统计元素个数
    • count_if                按条件统计元素个数

    find

    功能

    • 查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器

    函数原型

    find(iterator beg, iterator end, value);

    beg  —— 开始迭代器

    end  —— 结束迭代器

    value—— 查找的元素

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. #include
    6. class Person {
    7. public:
    8. Person(string name, int age) :m_Name(name), m_Age(age) {}
    9. // 重载 == 让底层 find 知道 == 方式
    10. bool operator==(const Person& p) {
    11. if (this->m_Name == p.m_Name && this->m_Age == p.m_Age) return true;
    12. else return false;
    13. }
    14. string m_Name;
    15. int m_Age;
    16. };
    17. // 查找内置数据类型
    18. void test1() {
    19. vector<int>v;
    20. for (int i = 0; i < 10; ++i) {
    21. v.push_back(i);
    22. }
    23. int find_x = 9;
    24. // 返回迭代器
    25. vector<int>::iterator it = find(v.begin(), v.end(), find_x);
    26. if (it != v.end()) {
    27. cout << "找到了" << *it << endl;
    28. }
    29. else {
    30. cout << "未找到" << endl;
    31. }
    32. }
    33. // 查找自定义数据类型
    34. void test2() {
    35. vectorv;
    36. Person p1("李四", 19);
    37. Person p2("张三", 19);
    38. Person p3("王五", 19);
    39. v.push_back(p1);
    40. v.push_back(p2);
    41. v.push_back(p3);
    42. Person find_p("张三", 19);
    43. vector::iterator it = find(v.begin(), v.end(), find_p);
    44. if (it != v.end()) {
    45. cout << "找到" << (*it).m_Name << " " << it->m_Age << endl;
    46. }
    47. else {
    48. cout << "未找到" << endl;
    49. }
    50. }
    51. int main() {
    52. test1();
    53. test2();
    54. system("pause");
    55. return 0;
    56. }

    运行结果:

    自定义数据类型查找的时候需要重载 == 运算符,让底层代码知道如何进行比较判断

    重载 == 改变解引用First 与 Val 的比较方式


    find_if

    功能

    • 按条件查找元素,找到返回指定元素的迭代器,找不到返回结束迭代器

    函数原型

    find_if(iterator beg, iterator end, _Pred);

    beg     —— 开始迭代器

    end     —— 结束迭代器

    _Pred  —— 函数或者谓词(返回 bool 类型的仿函数)

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. #include
    6. class Person {
    7. public:
    8. Person(string name, int age) :m_Name(name), m_Age(age) {}
    9. string m_Name;
    10. int m_Age;
    11. };
    12. class Greater5 {
    13. public:
    14. bool operator()(const int& x) {
    15. if (x > 5) return true;
    16. else return false;
    17. }
    18. };
    19. class Greater20 {
    20. public:
    21. bool operator()(const Person& p) {
    22. if (p.m_Age > 20) return true;
    23. else return false;
    24. }
    25. };
    26. bool Greater8(const int& x) {
    27. if (x > 8) return true;
    28. else return false;
    29. }
    30. bool Greater30(const Person& p) {
    31. if (p.m_Age > 30) return true;
    32. else return false;
    33. }
    34. // 内置数据类型 find_if
    35. void test01() {
    36. vector<int>v;
    37. for (int i = 0; i < 10; ++i) v.push_back(i + 1);
    38. vector<int>::iterator it1 = find_if(v.begin(), v.end(), Greater5()); // 传入仿函数(谓词)
    39. vector<int>::iterator it2 = find_if(v.begin(), v.end(), Greater8); // 传入普通函数
    40. if (it1 != v.end()) {
    41. cout << "find it " << *it1 << endl;
    42. }
    43. else {
    44. cout << "no find it" << endl;
    45. }
    46. if (it2 != v.end()) {
    47. cout << "find it " << *it2 << endl;
    48. }
    49. else {
    50. cout << "no find it" << endl;
    51. }
    52. }
    53. // 自定义数据类型 find_if
    54. void test02() {
    55. vectorv;
    56. Person p1("张三", 18);
    57. Person p2("张三", 30);
    58. Person p3("李四", 19);
    59. Person p4("王五", 40);
    60. v.push_back(p1);
    61. v.push_back(p2);
    62. v.push_back(p3);
    63. v.push_back(p4);
    64. vector::iterator it1 = find_if(v.begin(), v.end(), Greater20()); // 传入仿函数(谓词)
    65. vector::iterator it2 = find_if(v.begin(), v.end(), Greater30); // 传入普通函数
    66. if (it1 != v.end()) {
    67. cout << "找到了" << it1->m_Name << " " << (*it1).m_Age << endl;
    68. }
    69. else {
    70. cout << "未找到" << endl;
    71. }
    72. if (it2 != v.end()) {
    73. cout << "找到了" << it2->m_Name << " " << (*it2).m_Age << endl;
    74. }
    75. else {
    76. cout << "未找到" << endl;
    77. }
    78. }
    79. int main() {
    80. test01();
    81. test02();
    82. system("pause");
    83. return 0;
    84. }

    运行结果:

     find_it 底层代码

    只要是调用传入的函数(条件),所以无需重载操作符,只需要在函数或者仿函数里写清楚条件就可以,返回类型要能进行判断,所以为 bool 类型


    adjacent_find

    功能

    • 查找相邻重复元素,返回相邻元素的第一个位置的迭代器,没找到返回结束迭代器

    函数原型

    adjacent_find(iterator beg, iterator end);

    beg —— 开始迭代器

    end —— 结束迭代器

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. void test() {
    6. vector<int>v;
    7. v.push_back(10);
    8. v.push_back(20);
    9. v.push_back(10); // 相邻
    10. v.push_back(10); // 相邻
    11. v.push_back(40);
    12. v.push_back(30);
    13. vector<int>::iterator it = adjacent_find(v.begin(), v.end());
    14. if (it != v.end()) {
    15. cout << "find " << *it << endl;
    16. }
    17. else {
    18. cout << "no find" << endl;
    19. }
    20. }
    21. int main() {
    22. test();
    23. system("pause");
    24. return 0;
    25. }

    运行代码:


    功能

    • 查找指定元素是否存在,存在返回 true ,不存在返回 false

    函数原型

    bool binary_search(iterator beg, iterator end, value);

    beg   ——  开始迭代器

    end   ——  结束迭代器

    value ——  查找的元素

    注意:在 无序 、降序 序列中不可用

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. #include
    6. class Person {
    7. public:
    8. Person(string name, int age) :m_Name(name), m_Age(age) {}
    9. int m_Age;
    10. string m_Name;
    11. };
    12. // 测试 升序
    13. void test01() {
    14. vector<int>v;
    15. for (int i = 1; i < 11; ++i) {
    16. v.push_back(i);
    17. }
    18. for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
    19. cout << *it << " "; // 1 - 10
    20. }
    21. cout << endl;
    22. int find_x = 9;
    23. bool ret = binary_search(v.begin(), v.end(), find_x);
    24. if (ret != false) cout << "find it " << find_x << endl;
    25. else cout << "no find " << find_x << endl;
    26. }
    27. // 测试 倒序
    28. void test02() {
    29. vector<int>v;
    30. for (int i = 10; i > 0; --i) {
    31. v.push_back(i);
    32. }
    33. for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
    34. cout << *it << " "; // 10 - 1
    35. }
    36. cout << endl;
    37. int find_x = 9;
    38. bool ret = binary_search(v.begin(), v.end(), find_x);
    39. if (ret != false) cout << "find it " << find_x << endl;
    40. else cout << "no find " << find_x << endl;
    41. }
    42. // 测试 无序
    43. void test03() {
    44. vector<int>v;
    45. v.push_back(1);
    46. v.push_back(3);
    47. v.push_back(2);
    48. v.push_back(0);
    49. for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
    50. cout << *it << " "; // 1 3 2 0
    51. }
    52. cout << endl;
    53. int find_x = 3;
    54. bool ret = binary_search(v.begin(), v.end(), find_x);
    55. // 无序序列结果是未知的
    56. if (ret != false) cout << "find it " << find_x << endl;
    57. else cout << "no find " << find_x << endl;
    58. }
    59. int main() {
    60. test01();
    61. test02();
    62. test03();
    63. system("pause");
    64. return 0;
    65. }

    运行结果:


    count

    功能

    • 统计元素个数,返回 __int64 (元素出现的次数)

    函数原型

    count(iterator beg, iterator end, value);

    beg   —— 开始迭代器

    end   —— 结束迭代器

    value —— 统计的元素

    Val == *_UFirst,自定义数据类型的判断就需要改变 == 的方式,也就是重载

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. #include
    6. class Person {
    7. public:
    8. Person(string name, int age) :m_Name(name), m_Age(age) {}
    9. bool operator==(const Person& p) {
    10. if (this->m_Name == p.m_Name && this->m_Age == p.m_Age) {
    11. return true;
    12. }
    13. else {
    14. return false;
    15. }
    16. }
    17. string m_Name;
    18. int m_Age;
    19. };
    20. // 统计内置数据类型
    21. void test01() {
    22. vector<int>v;
    23. v.push_back(10);
    24. v.push_back(30);
    25. v.push_back(20);
    26. v.push_back(10);
    27. int count_x = 10;
    28. __int64 nums = count(v.begin(), v.end(), count_x);
    29. cout << count_x << "出现次数:" << nums << endl;
    30. }
    31. // 统计自定义数据类型
    32. void test02() {
    33. vectorv;
    34. Person p1("张三", 19);
    35. Person p2("李四", 20);
    36. Person p3("王五", 17);
    37. Person p4("王五", 17);
    38. Person p5("王五", 17);
    39. v.push_back(p1);
    40. v.push_back(p2);
    41. v.push_back(p3);
    42. v.push_back(p4);
    43. v.push_back(p5);
    44. Person count_Person("王五", 17);
    45. __int64 nums = count(v.begin(), v.end(), count_Person);
    46. cout << count_Person.m_Name << " " << count_Person.m_Age << " 出现次数:" << nums << endl;
    47. }
    48. int main() {
    49. test01();
    50. test02();
    51. system("pause");
    52. return 0;
    53. }

    运行结果:


    count_if

    功能

    • 按条件统计元素个数,返回 __int64 (元素出现次数)

    函数原型

    count_if(iterator beg, iterator end, _Pred);

    beg     —— 开始迭代器

    end     —— 结束迭代器

    _Pred  —— 谓词(仿函数)、函数

     测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. #include
    6. class Person {
    7. public:
    8. Person(string name, int age) :m_Name(name), m_Age(age) {}
    9. string m_Name;
    10. int m_Age;
    11. };
    12. // 自定义数据类型 count_if 仿函数
    13. class Person_find {
    14. public:
    15. bool operator()(const Person& p) {
    16. if (p.m_Age > 18) return true;
    17. else return false;
    18. }
    19. };
    20. // 内置数据类型 count_if 仿函数
    21. class my_find {
    22. public:
    23. bool operator()(const int& x) {
    24. if (x > 2 && x < 5) return true;
    25. else return false;
    26. }
    27. };
    28. // 内置数据类型 count_if
    29. void test01() {
    30. vector<int>v;
    31. v.push_back(5);
    32. v.push_back(1);
    33. v.push_back(2);
    34. v.push_back(4); // √
    35. v.push_back(3); // √
    36. __int64 nums = count_if(v.begin(), v.end(), my_find());
    37. cout << "满足大于 2 小于 5 条件的数: " << nums << endl; // 2
    38. }
    39. // 自定义数据类型 count_if
    40. void test02() {
    41. vectorv;
    42. Person p1("李四", 19);
    43. Person p2("张三", 20);
    44. Person p3("王五", 15);
    45. Person p4("李华", 10);
    46. v.push_back(p1); // √
    47. v.push_back(p2); // √
    48. v.push_back(p3);
    49. v.push_back(p4);
    50. __int64 nums = count_if(v.begin(), v.end(), Person_find());
    51. cout << "成年人数为:" << nums << endl; // 2
    52. }
    53. int main() {
    54. test01();
    55. test02();
    56. system("pause");
    57. return 0;
    58. }

    运行额结果:

  • 相关阅读:
    C#:实现交换排序算法(附完整源码)
    活动安排问题(贪心算法)
    netcore Polly.Core
    RxJava + Retrofit源码解析
    【机器学习算法】支持向量机(support Vector Machine,SVM)
    32、多租户(multi-tenancy)
    vue.js v-bind的基本使用语法
    华为企业AP开启IPV6包转发
    逻辑漏洞(pikachu)
    安卓WebApp开发-项目MiliSetu
  • 原文地址:https://blog.csdn.net/xuan3215/article/details/126181436