📅  最后修改于: 2023-12-03 14:39:52.881000             🧑  作者: Mango
在编写程序中,经常需要在已排序的序列中查找某个元素。STL提供了三个二进制搜索函数:binary_search、lower_bound和upper_bound。这些函数不仅提高了程序的效率,还减少了我们编写复杂查找算法的工作量。
二分查找是一种常见的查找算法,STL中提供了binary_search函数来实现它。binary_search函数返回一个bool类型的值,表示查找的元素是否存在于给定的序列中。
template <class ForwardIterator, class T>
bool binary_search(ForwardIterator first, ForwardIterator last, const T& value);
其中,first和last是表示序列的迭代器,value是要查找的值。如果value存在于序列中,则返回true,否则返回false。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> vec{1, 2, 3, 4, 5};
bool result = binary_search(vec.begin(), vec.end(), 3);
if (result) {
cout << "3 exists in vec!" << endl;
} else {
cout << "3 does not exist in vec!" << endl;
}
return 0;
}
运行结果:
3 exists in vec!
lower_bound函数返回一个迭代器,它指向第一个大于等于给定值的元素。如果给定值比序列中最后一个元素还要大,则返回last迭代器。
template <class ForwardIterator, class T>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
其中,first和last是表示序列的迭代器,value是要查找的值。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> vec{1, 2, 2, 3, 4, 5};
auto it = lower_bound(vec.begin(), vec.end(), 2);
cout << "The first element greater than or equal to 2 is " << *it << endl;
return 0;
}
运行结果:
The first element greater than or equal to 2 is 2
upper_bound函数返回一个迭代器,它指向第一个大于给定值的元素。如果给定值比序列中所有元素都要大,则返回last迭代器。
template <class ForwardIterator, class T>
ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
其中,first和last是表示序列的迭代器,value是要查找的值。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> vec{1, 2, 2, 3, 4, 5};
auto it = upper_bound(vec.begin(), vec.end(), 2);
cout << "The first element greater than 2 is " << *it << endl;
return 0;
}
运行结果:
The first element greater than 2 is 3
STL提供了二进制搜索功能,可以大大提高编程效率以及降低编写复杂算法的难度。其中,binary_search函数判断给定值是否存在于序列中,lower_bound函数返回第一个大于等于给定值的元素,upper_bound函数返回第一个大于给定值的元素。