std :: binary_search无法按预期工作

时间:2017-04-03 17:32:44

标签: algorithm vector binary-search

我尝试制作一个程序,使用std::binary_search

检查数字是否在向量中

我知道我可以使用std::find,但是如果比std::binary_search快得多,我听说std::find,所以如果我需要检查一下是否我想学会使用它一个数字在容器中。

代码:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::cout << "Enter number of elements: ";
    int n;
    std::cin >> n;
    std::vector<int> v(n);

    std::cout << "Enter the elements: ";
    std::for_each(v.begin(), v.end(), [](int &x)
    {
        std::cin >> x;
    });

    std::cout << "Enter a number: ";
    int number;
    std::cin >> number;

    bool doesItExist = std::binary_search(v.begin(), v.end(), number);

    if(doesItExist == false)
    {
        std::cout << "It doesn't exist!";
    }
    else std::cout << "It exists!";

    return 0;
}

如果在容器中找到了数字,我认为std::binary_search应该返回true

现在我将用几个例子解释我的代码会发生什么

在以下所有示例中,我将使用10个元素:

Enter number of elements: 10
Enter the elements: 1 10 100 -11 -112 -17 44 -99 99 558

Enter a number: 1
It doesn't exist!

Enter a number: 10
It doesn't exist!

它将继续这样,直到我输入最后两个数字之一(99558

前一个号码:

Enter a number: 99
It exists!

最后一个号码:

Enter a number: 558
It exists!

我不确定为什么会这样。 如果有人能解释为什么会发生这种情况,为什么只有最后2个数字有效? 什么是解决这个问题的方法?

谢谢

2 个答案:

答案 0 :(得分:1)

您误解了binary search的工作方式:您无法按任意顺序输入数字,并希望binary_search找到匹配项;必须订购该范围内的物品。这是二元搜索在决定从中间,右侧或左侧走哪条路时所做的假设。

如果在读取数据后将此行添加到代码中,则问题将得到解决:

std::sort(v.begin(), v.end());

此外,如果您按排序顺序输入数字,您的代码将无需修改即可运行:

-112 -99 -17 -11 1 10 44 99 100 558

答案 1 :(得分:0)

通常二元搜索应用于已排序的矢量或数组

你似乎没有排序。

对矢量进行排序,然后重新检查结果。