upper_bound 和 find 给出不同的结果
Posted
技术标签:
【中文标题】upper_bound 和 find 给出不同的结果【英文标题】:upper_bound and find giving different results 【发布时间】:2019-05-06 19:20:26 【问题描述】:我是 STL 的新手,在 vector 上使用了 find()
和 upper_bound()
函数来查找 6 的位置。代码如下
#include <bits/stdc++.h>
using namespace std;
int main()
vector<int> sam =1,2,5,3,7,8,4,6;
int f=upper_bound(sam.begin(), sam.end(), 6)- sam.begin();
vector<int>::iterator it;
it =find (sam.begin(), sam.end(), 6);
int d=it - sam.begin() ;
cout<<d<<" "<<f<<endl;
return 0;
运行代码时的输出是 7 4 ,而我预计它是 7 7 。 我做错了什么?
【问题讨论】:
std::upper_bound
(和std::lower_bound
,就此而言)要求被搜索的范围必须排序。 (这过于简单化了,但应该足以让您继续前进)。
This std::upper_bound
和 this std:lower_bound
参考可能会有所帮助。
如果容器中的数据是在运行时从外部源(用户、文件、网络等)创建或插入的怎么办?那你就不知道内容了。
【参考方案1】:
cppreference.com for std::upper_bound()
很好地解释了它(强调我的):
返回一个迭代器,该迭代器指向范围 [first, last) 中 大于 的第一个元素,如果没有找到这样的元素,则返回最后一个。
范围 [first, last) 必须相对于 表达式
!(value < element)
或!comp(value, element)
,即所有 表达式为true
的元素必须在所有元素之前 其表达式为false
。完全排序的范围符合这一点 标准。
在您的情况下,您有一个 7(大于 6,在索引 4 处)出现在 之前一个 4(等于或小于 6),因此不满足前提条件。 p>
std::upper_bound()
及其伙伴的想法是在已排序的数组中快速进行二进制搜索。与std::find()
中的线性搜索相反,它只需要 O(log(n)) 时间复杂度而不是 O(n)。
【讨论】:
那么如果我不使用“查找”,那么在这个向量中找到 6 的最有效方法是什么,因为它需要线性时间 如果你的数组没有排序,你必须使用线性搜索,因为不分析每个元素的算法无法知道搜索到的值是否出现之前 i> 或 在 当前选中的元素之后。以上是关于upper_bound 和 find 给出不同的结果的主要内容,如果未能解决你的问题,请参考以下文章