当前位置:   article > 正文

c++查找函数(如binary_search(),find())

binary_search()

1.binary_search  

头文件为<algorithm>

binary_search()用来查找目标数组中是否存在这个数

binary_search(起始地址,结束地址,要查找的数)

微软解释algorithm函数详细了解: 函数icon-default.png?t=N7T8https://learn.microsoft.com/zh-cn/cpp/standard-library/algorithm-functions?view=msvc-170#binary_searchbinary_search只能对已排好序(只能是升序)的数组进行搜索,返回true或false,

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main()
  5. {
  6. int a1[8] = { 2,56,21,45,17,5,77,9 };
  7. sort(a1, a1 + 8, less<int>()); //按升序排序
  8. for (int i = 0; i < 8; i++) cout << a1[i] << endl ;
  9. bool flag = binary_search(a1, a1 + 8, 20); //binary_search必须用于升序排好的数组才行。
  10. bool flag2 = binary_search(a1, a1 + 8, 45);
  11. cout <<flag<<endl;
  12. cout << flag2 << endl;
  13. return 0;
  14. }

 2.lower_bound

头文件为<algorithm>

lower_bound()用来找到>=目标数的地址

lower_bound(起始地址,结束地址,要查找的数)

lower_bound函数只能对已排好序(必须是升序)的数组进行查找;

且返回的是第一个>=目标数的地址

若没找到,返回的是最后一个元素的地址+该数组类型的字节,即所定义的数组大小

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main()
  5. {
  6. int a1[8] = { 2,56,21,45,17,5,77,9 };
  7. sort(a1, a1 + 8, less<int>()); //按升序排序
  8. for (int i = 0; i < 8; i++) cout << a1[i] << endl ;
  9. //lower_bound函数返回容器中第一个值>=目标元素的位置
  10. int* p = lower_bound(a1, a1 + 8, 45); //lower_bound函数只能在已排好序(升序)的数组查找
  11. int* q = lower_bound(a1, a1 + 8, 100); //lower_bound函数若找到返回的是地址。
  12. cout <<"45的地址:"<<p - a1 << endl; //返回下标
  13. cout << "100的地址:"<<q - a1 << endl; //若没找到,返回的是最后一个下标加1,即7+1=8
  14. return 0;
  15. }

3.upper_bound

头文件为<algorithm>

upper_bound()用来找到>目标数的地址

upper_bound(起始地址,结束地址,要查找的数)

upper_bound函数只能对已排好序(必须是升序)的数组进行查找;

且返回的是第一个>目标数的地址

若没找到,返回的是最后一个元素的地址+该数组类型的字节,即所定义的数组大小

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main()
  5. {
  6. int a1[8] = { 2,56,21,45,17,5,77,9 };
  7. sort(a1, a1 + 8, less<int>()); //按升序排序
  8. for (int i = 0; i < 8; i++) cout << a1[i] << endl ;
  9. //upper_bound函数返回容器中第一个值>目标元素的位置
  10. int* p = upper_bound(a1, a1 + 8, 45); //upper_bound函数只能在已排好序(升序)的数组查找
  11. int* q = upper_bound(a1, a1 + 8, 100); //upper_bound函数若找到返回的是地址。
  12. cout <<"比45大的第一个数的地址:"<<p - a1 << endl; //返回下标
  13. cout << "比100大的地址:"<<q - a1 << endl; //若没找到,返回的是最后一个下标加1,即7+1=8
  14. return 0;
  15. }

4.find

有说头文件为<algorithm>,但在vs的c++11标准中,单用<iostream>也行

find()函数用来找到目标数的地址

find(起始地址,结束地址,要查找的数)

find函数对不排序的数组同样适用

若找到,返回的是物理地址,所以要输出下标时需要减去首地址。

若没找到,返回的是最后一个元素的地址+该数组类型的字节,即所定义的数组大小

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main()
  5. {
  6. int a1[8] = { 2,56,21,45,17,5,77,9 };
  7. sort(a1, a1 + 8, less<int>()); //按升序排序
  8. for (int i = 0; i < 8; i++) cout << a1[i] << endl ;
  9. int* p = find(a1, a1 + 8, 21); //find函数若找到返回的是地址。
  10. int* q = find(a1, a1 + 8, 100);
  11. cout <<"21的地址:"<<p - a1 << endl; //返回下标
  12. cout << "100的地址:"<<q - a1 << endl; //若没找到,返回的是最后一个下标加1,即7+1=8
  13. int a2[8] = { 2,56,21,45,17,5,77,9 }; //将a2始终乱序
  14. int* p1 = find(a2, a2 + 8, 17); //find函数若找到返回的是地址。
  15. int* q1 = find(a2, a2 + 8, 10);
  16. for (int i = 0; i < 8; i++) cout << a2[i] << endl;
  17. cout <<"17的地址:"<< p1 - a2 << endl; //返回下标
  18. cout << "10的地址:" << q1 - a2 << endl; //若没找到,返回的是最后一个下标加1,即7+1=8
  19. return 0;
  20. }

5.find_if

头文件为<algorithm>

find_if()用来找到符合描述的数的地址

find_if(起始地址,结束地址,自建函数名(所描述的谓词))

谓词是一个接受一个元素作为参数并返回一个布尔值的函数或函数对象。

find_if函数对不排序的数组同样适用

若找到,返回的是物理地址,所以要输出下标时需要减去首地址。

若没找到,返回的是最后一个元素的地址+该数组类型的字节,即所定义的数组大小

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. bool mykey(int a)
  5. {
  6. return a > 44 && a < 46; //在本代码中,即查找45
  7. }
  8. bool mykey2(int a)
  9. {
  10. return a > 100; //在本代码中,即查找45
  11. }
  12. int main()
  13. {
  14. int a1[8] = { 2,56,21,45,17,5,77,9 };
  15. sort(a1, a1 + 8, less<int>()); //按升序排序
  16. for (int i = 0; i < 8; i++) cout << a1[i] << endl ;
  17. //find_if函数返回容器中第一个符合"第三个参数函数"(即谓词)所描述的位置
  18. int* p = find_if(a1, a1 + 8, mykey);
  19. int* p1 = find_if(a1, a1 + 8, mykey2);
  20. cout <<"符合第一个描述的地址:"<<p - a1 << endl; //返回下标
  21. cout << "符合第2个描述的地址:" << p1 - a1 << endl;
  22. cout << endl;
  23. //find_if函数也可以对未排序的数组查找
  24. int a2[8] = { 2,56,21,45,17,5,77,9 };
  25. for (int i = 0; i < 8; i++) cout << a2[i] << endl;
  26. int* q = find_if(a2, a2 + 8, mykey);
  27. int* q1 = find_if(a2, a2 + 8, mykey2);
  28. cout << "符合第一个描述的地址:" << q - a2 << endl; //返回下标
  29. cout << "符合第2个描述的地址:" << q1 - a2 << endl;
  30. return 0;
  31. }

6.count

头文件为<algorithm>

count()用来数目标数的个数

count(起始地址,结束地址,要查找的数)

count函数对不排序的数组同样适用

count函数返回的是查到的个数

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main()
  5. {
  6. int a1[8] = { 2,56,21,45,77,5,77,9 };
  7. sort(a1, a1 + 8, less<int>()); //按升序排序
  8. for (int i = 0; i < 8; i++) cout << a1[i] << endl ;
  9. int a = count(a1, a1 + 8, 9);
  10. cout << a <<endl;
  11. int a2[8] = { 2,56,21,45,77,5,77,9 };
  12. for (int i = 0; i < 8; i++) cout << a2[i] << endl;
  13. int b = count(a2, a2 + 8, 77);
  14. cout << b << endl;
  15. return 0;
  16. }

7.adjacent_find

头文件为<algorithm>

adjacent_find()用来找2个相邻且重复的数的第一个数的地址

adjacent_find(起始地址,结束地址)

adjacent_find函数与数组乱不乱序无关

adjacent_find函数返回的是第一个相邻重复元素的地址

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main()
  5. {
  6. int a1[8] = { 21,56,21,45,77,5,77,9 };
  7. sort(a1, a1 + 8, less<int>()); //按升序排序
  8. for (int i = 0; i < 8; i++) cout << a1[i] << endl ;
  9. //adjacent_find函数返回的是第一个相邻重复元素的地址
  10. int *p = adjacent_find(a1, a1 + 8);
  11. cout <<"第一个重复元素的地址:" << p-a1<<endl;
  12. //adjacent_find函数与数组乱不乱序无关
  13. int a2[8] = { 56,23,21,45,77,5,9,9 };
  14. for (int i = 0; i < 8; i++) cout << a2[i] << endl;
  15. int *b = adjacent_find(a2,a2 + 8);
  16. cout << "第一个重复元素的地址" << b-a2 << endl;
  17. return 0;
  18. }


参考:

STL之二分查找(binary_search(),lower_bound(),upper_bound() )_std::lower_bound头文件-CSDN博客文章浏览阅读5.8k次,点赞4次,收藏16次。二分查找(二分检索):二分法检索又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中,首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;否则,若key小,则在字典前半部分中继续进行二分法检索;若key大,则在字典后半部分中继续进行二分法检索。这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失..._std::lower_bound头文件https://blog.csdn.net/zwj1452267376/article/details/47150521

c++自带的查找函数详解_C 语言_脚本之家这篇文章主要介绍了c++自带的查找函数,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下icon-default.png?t=N7T8https://www.jb51.net/program/2976939ij.htm 蓝桥杯赛前准备 - 知乎1.可以使用的万能头文件#include<bits/stdc++.h>2.最后一定记住return 0; 3.蓝桥杯的最大栈空间为256MB,即最大可以开1e7(1*10^7)左右的数组空间 4.各类数据的范围1.int -2147483648~2147483647 //9位及以…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/489285845

c++的查找算法总结_查找特定的值c++语言-CSDN博客文章浏览阅读759次。如果找到相邻的一对元素满足条件,则返回指向第一个相邻元素的迭代器;算法函数用于在指定范围内查找相邻的两个元素,满足指定的条件。算法函数用于在有序范围内进行二分查找,判断指定的值是否存在。算法用于在有序范围内进行二分查找,判断指定的值是否存在。算法用于在指定范围内查找相邻的两个元素,满足指定的条件。算法函数用于计算指定值在指定范围内出现的次数。算法用于计算指定值在指定范围内出现的次数。内查找第一对相邻的元素,满足相等的条件。如果不存在指定值,则返回。返回等于指定值的元素个数。如果存在指定值,则返回。_查找特定的值c++语言https://blog.csdn.net/luosuss/article/details/134766064 C++中提供的一些关于查找元素的函数_c++数组查找某个元素-CSDN博客文章浏览阅读1k次。C++可用于查找的函数汇总_c++数组查找某个元素https://blog.csdn.net/CHNIM/article/details/132433273

adjacent_find算法(C++)_c++ adjacent_find-CSDN博客文章浏览阅读192次。adjacent_find算法_c++ adjacent_findhttps://blog.csdn.net/weixin_53213086/article/details/127000847?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-127000847-blog-127289461.235%5Ev43%5Epc_blog_bottom_relevance_base9&spm=1001.2101.3001.4242.1&utm_relevant_index=3

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

闽ICP备14008679号