#include <iostream>
#include <vector>
using namespace std;
bool isFound(vector<double> dvec, double value)
{
auto b = dvec.begin(), e = dvec.end();
auto m = (e - b) / 2 + b;
//1 2 3 4 (第三个,中间靠右)
// 1 2 3 4 5(第三个,正中间)
while (m != e)
{
if (value < *m) {
//在左侧
e = m-1 ;
}
else if (value == *m){
return true;
}
else{
b = m +1;
}
m = (e - b) / 2 + b;
}
if (e != dvec.end()&&value==*m)
return true;
return false;
}
int main()
{
vector<double> dvec{
2,3,3.44,4,5,6 };
bool ok = isFound(dvec, 4);
return 0;
}
how to say. In fact, this has been included in the C++ algorithm library, and it is probably too common:
bool ok1 = binary_search(dvec.begin(), dvec.end(), 4);
Looking at the latest standard library, a predicate is also supported for dichotomy.
template< class ForwardIt, class T >
bool binary_search( ForwardIt first, ForwardIt last, const T& value );
(until C++20)
template< class ForwardIt, class T >
constexpr bool binary_search( ForwardIt first, ForwardIt last, const T& value );
(since C++20)
template< class ForwardIt, class T, class Compare >
bool binary_search( ForwardIt first, ForwardIt last, const T& value, Compare comp );
(until C++20)
template< class ForwardIt, class T, class Compare >
constexpr bool binary_search( ForwardIt first, ForwardIt last, const T& value, Compare comp );