El iterador implementa la búsqueda binaria

#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 );

Supongo que te gusta

Origin blog.csdn.net/weixin_39258979/article/details/113882435
Recomendado
Clasificación