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 搜索範圍內的元素,無論它是什麽類型的對象。即使對於用戶定義的數據類型,我們也可以通過使用用戶定義的比較器來完成,如上所示。但是,要記住的主要事情是輸入列表必須排序(基於鍵)。例如,當我們搜索分數時,我們根據分數對學生列表進行排序。
相關用法
- C++ std::bit_or用法及代碼示例
- C++ std::bit_xor用法及代碼示例
- C++ std::basic_istream::gcount()用法及代碼示例
- C++ std::basic_istream::getline用法及代碼示例
- C++ std::basic_string::max_size用法及代碼示例
- C++ std::bsearch用法及代碼示例
- C++ std::basic_istream::ignore用法及代碼示例
- C++ std::back_inserter用法及代碼示例
- C++ std::basic_string::at用法及代碼示例
- C++ std::max()用法及代碼示例
- C++ std::string::push_back()用法及代碼示例
- C++ std::less_equal用法及代碼示例
- C++ std::is_member_object_pointer模板用法及代碼示例
- C++ std::copy_n()用法及代碼示例
- C++ std::string::insert()用法及代碼示例
- C++ std::is_sorted_until用法及代碼示例
- C++ std::iota用法及代碼示例
- C++ std::numeric_limits::digits用法及代碼示例
- C++ std::string::data()用法及代碼示例
- C++ std::is_permutation用法及代碼示例
注:本文由純淨天空篩選整理自 std::binary_search() in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。