std:: binary_search
|
Défini dans l'en-tête
<algorithm>
|
||
| (1) | ||
|
template
<
class
ForwardIt,
class
T
>
bool
binary_search
(
ForwardIt first, ForwardIt last,
|
(constexpr depuis C++20)
(jusqu'à C++26) |
|
|
template
<
class
ForwardIt,
class
T
=
typename
std::
iterator_traits
<
ForwardIt
>
::
value_type
>
|
(depuis C++26) | |
| (2) | ||
|
template
<
class
ForwardIt,
class
T,
class
Compare
>
bool
binary_search
(
ForwardIt first, ForwardIt last,
|
(constexpr depuis C++20)
(jusqu'à C++26) |
|
|
template
<
class
ForwardIt,
class
T
=
typename
std::
iterator_traits
<
ForwardIt
>
::
value_type
,
|
(depuis C++26) | |
Vérifie si un élément équivalent à
value
apparaît dans la partition de la plage
[
first
,
last
)
.
|
Si
!
bool
(
*
iter
<
value
)
&&
!
bool
(
value
<
*
iter
)
est
true
pour un itérateur
iter
dans
Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :
|
(jusqu'à C++20) |
|
Équivalent à std :: binary_search ( first, last, value, std:: less { } ) . |
(depuis C++20) |
[
first
,
last
)
, retourne
true
. Sinon retourne
false
.
-
Pour tout élément
elem
de
[first,last), bool ( comp ( elem, value ) ) n'implique pas ! bool ( comp ( value, elem ) ) . -
Les éléments
elem
de
[first,last)ne sont pas partitionnés par rapport aux expressions bool ( comp ( elem, value ) ) et ! bool ( comp ( value, elem ) ) .
Table des matières |
Paramètres
| first, last | - | la paire d'itérateurs définissant la plage partitionnée des éléments à examiner |
| value | - | valeur à comparer aux éléments |
| comp | - |
prédicat binaire qui renvoie
true
si le premier argument est ordonné avant le second.
La signature de la fonction de prédicat doit être équivalente à ce qui suit : bool pred ( const Type1 & a, const Type2 & b ) ;
Bien que la signature n'ait pas besoin d'avoir
const
&
, la fonction ne doit pas modifier les objets qui lui sont passés et doit pouvoir accepter toutes les valeurs de type (éventuellement const)
|
| 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 ) :
Cependant, si
ForwardIt
n'est pas un
LegacyRandomAccessIterator
, le nombre d'incrémentations 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
vérifie uniquement si un élément équivalent existe. Pour obtenir un itérateur vers cet élément (s'il existe),
std::lower_bound
devrait ê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 également 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 << "Recherche de " << needle << '\n'; if (std::binary_search(haystack.begin(), haystack.end(), needle)) std::cout << "Trouvé " << needle << '\n'; else std::cout << "Non trouvé !\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 :
Recherche de 1 Trouvé 1 Recherche de 2 Non trouvé ! Recherche de 3 Trouvé 3
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 270 | C++98 |
Compare
devait satisfaire
Compare
et
T
devait être
LessThanComparable (ordre faible strict requis) |
seul un partitionnement est requis ;
comparaisons hétérogènes autorisées |
| LWG 787 | C++98 | au maximum log 2 (N)+2 comparaisons étaient autorisées | corrigé en log 2 (N)+O(1) |
Voir aussi
|
retourne la plage d'éléments correspondant à une clé spécifique
(modèle de fonction) |
|
|
retourne un itérateur vers le premier élément
non inférieur
à la valeur donnée
(modèle de fonction) |
|
|
retourne un itérateur vers le premier élément
supérieur
à une certaine valeur
(modèle de fonction) |
|
|
(C++20)
|
détermine si un élément existe dans une plage partiellement ordonnée
(objet fonction algorithme) |