#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;
}
cómo decir. De hecho, esto se ha incluido en la biblioteca de algoritmos de C ++ y probablemente sea demasiado común:
bool ok1 = binary_search(dvec.begin(), dvec.end(), 4);
En cuanto a la biblioteca estándar más reciente, también se admite un predicado para dicotomía.
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 );