std::binary_search
| Défini dans l'en-tête <algorithm>
|
||
template< class ForwardIt, class T >
bool binary_search( ForwardIt first, ForwardIt last,
const T& value );
|
(1) | (jusqu'à C++26) (constexpr depuis C++20) |
template< class ForwardIt, class T = typename std::iterator_traits
<ForwardIt>::value_type >
constexpr bool binary_search( ForwardIt first, ForwardIt last,
const T& value );
|
(depuis C++26) | |
template< class ForwardIt, class T, class Compare >
bool binary_search( ForwardIt first, ForwardIt last,
const T& value, Compare comp );
|
(2) | (jusqu'à C++26) (constexpr depuis C++20) |
template< class ForwardIt, class T = typename std::iterator_traits
<ForwardIt>::value_type,
class Compare >
constexpr bool binary_search( ForwardIt first, ForwardIt last,
const T& value, Compare comp );
|
(depuis C++26) | |
Vérifie si un élément équivalent à value apparaît dans la plage partitionnée [first, last).
operator< :
|
Si Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :
|
(jusqu'à C++20) |
|
Équivalent à |
(depuis C++20) |
comp :!bool(comp(*iter, value)) && !bool(comp(value, *iter)) est true pour un itérateur iter dans [first, last), retourne true. Sinon retourne false.- Pour tout élément
elemde[first,last),bool(comp(elem, value))n'implique pas!bool(comp(value, elem)). - Les éléments
elemde[first,last)ne sont pas partitionnés par rapport aux expressionsbool(comp(elem, value))et!bool(comp(value, elem)).
Paramètres
| first, last | - | la paire d'itérateurs définissant la plage partitionnée d'éléments à examiner |
| value | - | valeur à laquelle comparer les éléments |
| comp | - | prédicat binaire qui retourne true si le premier argument est ordonné avant le second. La signature de la fonction de prédicat doit être équivalente à ce qui suit :
Bien que la signature n'ait pas besoin d'avoir |
| Exigences de type | ||
-ForwardIt doit satisfaire aux exigences de LegacyForwardIterator.
| ||
-Compare doit satisfaire aux exigences de BinaryPredicate. Il n'est pas requis de satisfaire Compare.
| ||
Valeur de retour
true si un élément équivalent à value est trouvé, false sinon.
Complexité
Étant donné N comme std::distance(first, last) :
value en utilisant operator<(jusqu'à C++20)std::less{}(depuis C++20).comp.Cependant, si ForwardIt n'est pas un LegacyRandomAccessIterator, le nombre d'incréments d'itérateur est linéaire en N.
Notes
Bien que std::binary_search exige seulement que [first, last) soit partitionné, cet algorithme est généralement utilisé dans le cas où [first, last) est trié, de sorte que la recherche binaire soit valide pour toute value.
std::binary_search ne vérifie que si un élément équivalent existe. Pour obtenir un itérateur vers cet élément (s'il existe), std::lower_bound doit être utilisé à la place.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403 |
(C++26) | Initialisation par liste pour les algorithmes (1,2) |
Implémentation possible
Voir aussi les implémentations dans libstdc++ et libc++.
| binary_search (1) |
|---|
template<class ForwardIt, class T = typename std::iterator_traits<ForwardIt>::value_type>
bool binary_search(ForwardIt first, ForwardIt last, const T& value)
{
return std::binary_search(first, last, value, std::less{});
}
|
| binary_search (2) |
template<class ForwardIt, class T = typename std::iterator_traits<ForwardIt>::value_type,
class Compare>
bool binary_search(ForwardIt first, ForwardIt last, const T& value, Compare comp)
{
first = std::lower_bound(first, last, value, comp);
return (!(first == last) and !(comp(value, *first)));
}
|
Exemple
#include <algorithm>
#include <cassert>
#include <complex>
#include <iostream>
#include <vector>
int main()
{
const auto haystack = {1, 3, 4, 5, 9};
for (const auto needle : {1, 2, 3})
{
std::cout << "Searching for " << needle << '\n';
if (std::binary_search(haystack.begin(), haystack.end(), needle))
std::cout << "Found " << needle << '\n';
else
std::cout << "Not found!\n";
}
using CD = std::complex<double>;
std::vector<CD> nums{{1, 1}, {2, 3}, {4, 2}, {4, 3}};
auto cmpz = [](CD x, CD y){ return abs(x) < abs(y); };
#ifdef __cpp_lib_algorithm_default_value_type
assert(std::binary_search(nums.cbegin(), nums.cend(), {4, 2}, cmpz));
#else
assert(std::binary_search(nums.cbegin(), nums.cend(), CD{4, 2}, cmpz));
#endif
}
Sortie :
Searching for 1
Found 1
Searching for 2
Not found!
Searching for 3
Found 3
Rapports de défauts
Les rapports de défauts suivants, modifiant le comportement, ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 270 | C++98 | Compare devait satisfaire Compare et T devaitêtre LessThanComparable (ordre faible strict requis) |
seul un partitionnement est requis ; les comparaisons hétérogènes sont permises |
| LWG 787 | C++98 | au plus log2(N)+2 comparaisons étaient autorisées | corrigé en log2(N)+O(1) |
Voir aussi
| trouve la plage d'éléments correspondant à la valeur donnée en utilisant la recherche binaire (modèle de fonction / objet de fonction d'algorithme)& | |
(C++20) |
|
| trouve le premier élément non inférieur à la valeur donnée en utilisant la recherche binaire (modèle de fonction / objet de fonction d'algorithme)& | |
(C++20) |
|
| trouve le premier élément supérieur à la valeur donnée en utilisant la recherche binaire (modèle de fonction / objet de fonction d'algorithme)& | |
(C++20) |
|
(C++20) |
détermine si un élément existe dans une plage en utilisant la recherche binaire (objet de fonction d'algorithme) |