| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++库函数 使用dinary_search -> 正文阅读 |
|
[C++知识库]C++库函数 使用dinary_search |
?? dinary_search二分查找,查找给定容器中是否包含第三个参数,函数原型如下: bool?binary_search(_FwdIt?_First, _FwdIt?_Last, const?_Ty& _Val); 第一个参数是需要遍历的容器中的第一个元素的迭代器值,第二个参数是容器中最后一个元素之后的迭代器值,需要遍历整个容器第一个参数给到 ?(容器对象).begin() ?第二个参数给到 (容器对象).end() 。 第三个参数则需要向容器查找的值。 返回值是bool值 找到则返回 true 反之返回 false。 ?????例如: vector<int> vec = {1,2,3,4}; bool?bol = binary_search(vec.begin(), vec.end(), 4); cout.setf(ios::boolalpha); cout <<?bol <<?endl; ? binary_search默认给到查询条件是 仿函数less<int>(), 如果给定容器元素没有按照less<int>() 规则排序(比如:容器中的前一个元素值必须小于后一个元素值,也即升序排序),那么我们可能会找不到其中的值。 ???例如: vector<int> vec = {1,4,2,3,}; bool?bol = binary_search(vec.begin(), vec.end(), 4); cout.setf(ios::boolalpha); cout <<?bol <<?endl; ????? ? 但是我们需要在容器中查找val的时候,并不一定需要按照升序排序。因为binary_search是二分查找(而需要在容器中查找的值val恰好在这个容器的任意一个地方),所以给定三个参数如果是在 index=1+(容器元素个数的一半),index个参数之后,那么第index个参数必须比val 要小,接下来容器查找的索引会变成 index2 =index+1+((容器元素个数-index)/2),如果val还在这个index2个元素之后那么 第index2个元素也要比val要小,然后容器查找的索引为 index3 = index2+1+(容器-index2)/2, 如果val还在index3之后,这个规则如此简单,想必,查看本文章的各位应该很容易就搞清了吧。那如果val 不在某个index之后呢,它恰好比index之后,又在index2之前。那么第index2个元素就必须要比val值要大,这是必须的不然binary_search还会继续找下去,直到 index到达容器末尾,当val在容器的位置恰好在index和index2之间,那么下一个index3 = index+1+((容器元素大小-index)/2)/2(至于为什么是(容器元素大小-index)/2,详解可能会很麻烦),那么还需要判断val容器中第index3处元素和index2处的元素之间,或在index处元素和index3处元素之间,如果是前一种那么index3处的元素就要比val要小,此时index4 = index3+1+((容器元素大小-index)/2-((容器元素大小-index)/2)/2+1),如果((容器元素大小-index)/2-((容器元素大小-index)/2)/2+1)是一个0(int),Index4处的元素是最后一次比较的元素,我刚刚说了index3处的元素是要比val要小的,那么index4很有可能就是我们要查找的val,或者index4+1处的元素就是val,如果是后一种index4必须要比val要小,否则找不到正确的值,函数返回false。 刚刚我举例了index =1+(容器元素个数/2),val在index之后。现在我们看看val在index之前而容器内元素不规则排序而val又在容器的某一处位置,需要什么条件才能找到val。如果val在index之前那么index处的元素必须要比val要大,下一次index2 = 1+(容器元素个数/2)/2,如果val在index之后,那么index要比val要小下一次index3 = index2+1+(容器元素个数/2 - (容器元素个数/2)/2 +1)/2 ,如果val还在Index3处元素之后,index3处的元素肯定要比val要小,假设下一次索引为最后一次比较那么index4 = index3 +1 +0; 如果index4处的索引要比val小而val在容器中的话,那么index5 =index4+1 ,index5处的元素就是val,同时index5 == index; 不然index4就是val所在的位置。还有很过例子,我举的例子是在容器数量为8个的时候,用binary_search查找无序规则容器的条件,任何一种条件不满足,而val只在容器中存在一次,那么一定找不到。 binary_search的重载版本 bool binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val, _Pr _Pred) 我们可以指定binary_search查找的条件,比如greater<int>() 它和less<>()的规则正好相反,又比如我们使用binary_search原版,它要求容器升序排序,如果我给一个降序排序的容器给它,它一定找不到容器中的任何一个元素。 例如: vector<int> vec = { 4,3,2,1 }; bool?bol = binary_search(vec.begin(), vec.end(), 4); cout.setf(ios::boolalpha); cout <<?bol <<?endl; ? ?此时我再将greater<int>()作为第四个参数,结果就不一样了。 vector<int> vec = { 4,3,2,1 }; bool?bol = binary_search(vec.begin(), vec.end(), 4); cout.setf(ios::boolalpha); cout <<?bol <<?endl; bol = binary_search(vec.begin(), vec.end(), 4,greater<int>()); cout <<?bol <<?endl; ? |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 19:14:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |