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++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。