當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。