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 &lt; 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 给出不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

1030 完美数列 (二分法upper_bound)

STL之二分查找 (转载)

如何获得multimap的中的key的数目

是否可以使用 grep 或 find 命令替换仅给出前几个和最后几个单词的给定字符串

通过共享内存和管道的 IPC 给出分段错误:C 中的 11

std::multimap