当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ std::binary_search()用法及代码示例


binary_search() 作为 STL 函数

用法:

bool binary_search (
    ForwardIterator first, 
    ForwardIterator last, 
    const T& value);

其中,

  • ForwardIterator first= 迭代器到范围的开始
  • ForwardIterator last=迭代器到范围结束
  • T &value= 对数据类型为 T 的搜索元素的引用,T 可以是任何内置数据类型或用户定义的数据类型

返回类型: bool

  • 真的- 如果在范围内找到元素
  • 错误的- 如果在范围内找不到元素

上述语法用于使用标准比较运算符比较元素。如果 (!(a<b) && !(a>b)),则称两个元素 a & b 相等。

我们还可以定义用户定义的比较器进行比较。用户定义比较器的语法如下:

bool binary_search(
    ForwardIterator first, 
    ForwardIterator last, 
    const T& val, 
    Comparator comp);

使用上述语法,如果 (!comp(a<b) && !comp(a>b)) 两个元素 a & b 将相等。

1) 使用默认比较器

#include <bits/stdc++.h>
using namespace std;

int main()
{
    vector<int> arr{ 3, 2, 1, 4, 5, 6, 7 };

    //tp perform binary search we need sorted 
    //input array
    sort(arr.begin(), arr.end());

    int search_element = 4;

    //ForwardIterator first=arr.begin()
    //ForwardIterator last=arr.end()
    //const T& val=search_element
    if (binary_search(arr.begin(), arr.end(), search_element)) {
        cout << "search_element " << search_element << " found\n";
    }
    else
        cout << "search_element" << search_element << " not found\n";

    search_element = 7;
    
    //ForwardIterator first=arr.begin()
    //ForwardIterator last=arr.begin()+arr.size()-1
    //const T& val=search_element
    if (binary_search(arr.begin(), arr.begin() + arr.size() - 1, search_element)) {
        cout << "search_element " << search_element << " found\n";
    }
    else
        cout << "search_element " << search_element << " not found\n";

    return 0;
}

输出:

search_element 4 found
search_element 7 not found

在上面的程序中,我们已经检查了案例并使用了默认的比较器。不用说,由于这里使用二分搜索算法进行搜索,我们只需要输入已排序的数组。

因此,作为先决条件,我们对数组进行了排序。排序后的数组为:[1,2,3,4,5,6,7]

然后对于第一种情况,我们的范围是整个向量,它返回 true 是因为它找到了搜索元素 4。

对于第二种情况,我们的范围是 [1-6],因为我们提到了结束迭代器 arr.begin()+arr.size()-1,它留下了最后一个元素 7。所以没有找到搜索的元素 7。

2) 使用用户定义的比较器函数

在这里,我们采用了一个用例,其中我们有五个学生的学生详细信息。通过使用用户定义的比较器,我们检查了是否存在具有指定分数的学生。

#include <bits/stdc++.h>
using namespace std;

class student {

    int score;
    int roll;
    string name;

public:
    student()
    {
        score = 0;
        roll = 0;
        name = "";
    }
    student(int sc, int ro, string nm)
    {
        score = sc;
        roll = ro;
        name = nm;
    }

    int get_score()
    {
        return score;
    }
    int get_roll()
    {
        return roll;
    }
    string get_name()
    {
        return name;
    }
};

//comparator for sorting
bool myfunc(student a, student b)
{

    if (a.get_score() < b.get_score()) //no swap
        return true;

    else //swap
        return false;
}

//comparator for binary search
//match found if !mycomp(a,b) && !mycomp(b,a)

bool mycomp(student a, student b)
{

    if (a.get_score() < b.get_score())
        return true;

    return false;
}

int main()
{
    vector<student> arr(5);
    //1st student
    arr[0] = student(80, 5, "XYZ"); //roll 5, marks 80
    //2nd student
    arr[1] = student(70, 10, "INC"); //roll 10, marks 70
    //3rd student
    arr[2] = student(85, 7, "HYU"); //roll 7, marks 85
    //4th student
    arr[3] = student(83, 1, "EFG"); //roll 1,  marks 83
    //5th student
    arr[4] = student(81, 11, "ABC"); //roll 11,  marks 81

    //sort based on marks
    //user-defined compartor=myfunc to sort
    sort(arr.begin(), arr.end(), myfunc);

    //find if any student exists who scored 81
    student t1(81, -1, ""); //dummy search element just to search the student marks
    if (binary_search(arr.begin(), arr.end(), t1, mycomp))
        cout << "Student with marks 81 exists\n";
    else
        cout << "Student with marks 81 doesn't exist\n";

    //find if any student exists who scored 75
    student t2(75, -1, ""); //dummy search element just to search the student marks
    if (binary_search(arr.begin(), arr.end(), t2, mycomp))
        cout << "Student with marks 75 exists\n";
    else
        cout << "Student with marks 75 doesn't exist\n";

    return 0;
}

输出:

Student with marks 81 exists
Student with marks 75 doesn't exist

在这里,我们首先使用用户定义的比较器函数对学生向量进行了排序。我们为二分搜索定义了一个单独的比较器,尽管两者具有相同的主体。我们指定只是为了强调两个比较器的使用方式不同的因子。在搜索的情况下,如果 !comp(a,b) && !comp(b, a) 则存在匹配 b/w T a 和 T b(T 是数据类型),其中 a 是向量中的元素,b 是搜索元素。

因此,在本文中,您看到了我们可以如何有效地使用 binary_search 搜索范围内的元素,无论它是什么类型的对象。即使对于用户定义的数据类型,我们也可以通过使用用户定义的比较器来完成,如上所示。但是,要记住的主要事情是输入列表必须排序(基于键)。例如,当我们搜索分数时,我们根据分数对学生列表进行排序。



相关用法


注:本文由纯净天空筛选整理自 std::binary_search() in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。