std::ranges:: binary_search
|
Défini dans l'en-tête
<algorithm>
|
||
|
Signature d'appel
|
||
| (1) | ||
|
template
<
std::
forward_iterator
I,
std::
sentinel_for
<
I
>
S,
class
T,
class
Proj
=
std::
identity
,
|
(depuis C++20)
(jusqu'à C++26) |
|
|
template
<
std::
forward_iterator
I,
std::
sentinel_for
<
I
>
S,
class
Proj
=
std::
identity
,
|
(depuis C++26) | |
| (2) | ||
|
template
<
ranges::
forward_range
R,
class
T,
class
Proj
=
std::
identity
,
|
(depuis C++20)
(jusqu'à C++26) |
|
|
template
<
ranges::
forward_range
R,
class
Proj
=
std::
identity
,
|
(depuis C++26) | |
[
first
,
last
)
.
Pour que
ranges::binary_search
réussisse, la plage
[
first
,
last
)
doit être au moins partiellement ordonnée par rapport à
value
, c'est-à-dire qu'elle doit satisfaire à toutes les exigences suivantes :
- partitionné par rapport à std:: invoke ( comp, std:: invoke ( proj, element ) , value ) (c'est-à-dire, tous les éléments projetés pour lesquels l'expression est true précèdent tous les éléments pour lesquels l'expression est false ).
- partitionné par rapport à ! std:: invoke ( comp, value, std:: invoke ( proj, element ) ) .
- pour tous les éléments, si std:: invoke ( comp, std:: invoke ( proj, element ) , value ) est true alors ! std:: invoke ( comp, value, std:: invoke ( proj, element ) ) est également true .
Une gamme entièrement triée répond à ces critères.
Les entités de type fonction décrites sur cette page sont des objets fonction d'algorithmes (informellement appelés niebloids ), c'est-à-dire :
- Les listes d'arguments de modèle explicites ne peuvent pas être spécifiées lors de l'appel de l'une d'entre elles.
- Aucune d'entre elles n'est visible pour la recherche dépendante des arguments .
- Lorsque l'une d'entre elles est trouvée par la recherche non qualifiée normale comme nom à gauche de l'opérateur d'appel de fonction, la recherche dépendante des arguments est inhibée.
Table des matières |
Paramètres
| first, last | - | la paire itérateur-sentinelle définissant la plage des éléments à examiner |
| r | - | la plage des éléments à examiner |
| value | - | valeur à comparer aux éléments |
| comp | - | fonction de comparaison à appliquer aux éléments projetés |
| proj | - | projection à appliquer aux éléments |
Valeur de retour
true si un élément égal à value est trouvé, false sinon.
Complexité
Le nombre de comparaisons et de projections effectuées est logarithmique par rapport à la distance entre first et last (au plus log 2 (last - first) + O(1) comparaisons et projections). Cependant, pour une paire itérateur-sentinelle qui ne modélise pas std::random_access_iterator , le nombre d'incrémentations d'itérateur est linéaire.
Notes
std::ranges::binary_search
ne renvoie pas un itérateur vers l'élément trouvé lorsqu'un élément dont la projection est égale à
value
est trouvé. Si un itérateur est souhaité,
std::ranges::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
struct binary_search_fn { template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity, class T = std::projected_value_t<I, Proj>, std::indirect_strict_weak_order <const T*, std::projected<I, Proj>> Comp = ranges::less> constexpr bool operator()(I first, S last, const T& value, Comp comp = {}, Proj proj = {}) const { auto x = ranges::lower_bound(first, last, value, comp, proj); return (!(x == last) && !(std::invoke(comp, value, std::invoke(proj, *x)))); } template<ranges::forward_range R, class Proj = std::identity, class T = std::projected_value_t<ranges::iterator_t<R>, Proj>, std::indirect_strict_weak_order <const T*, std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less> constexpr bool operator()(R&& r, const T& value, Comp comp = {}, Proj proj = {}) const { return (*this)(ranges::begin(r), ranges::end(r), value, std::move(comp), std::move(proj)); } }; inline constexpr binary_search_fn binary_search; |
Exemple
#include <algorithm> #include <cassert> #include <complex> #include <iostream> #include <ranges> #include <vector> int main() { constexpr static auto haystack = {1, 3, 4, 5, 9}; static_assert(std::ranges::is_sorted(haystack)); for (const int needle : std::views::iota(1) | std::views::take(3)) { std::cout << "Recherche de " << needle << " : "; std::ranges::binary_search(haystack, needle) ? std::cout << "trouvé " << needle << '\n' : std::cout << "aucun résultat !\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::ranges::binary_search(nums, {4, 2}, cmpz)); #else assert(std::ranges::binary_search(nums, CD{4, 2}, cmpz)); #endif }
Sortie :
Recherche de 1 : trouvé 1 Recherche de 2 : aucun résultat ! Recherche de 3 : trouvé 3
Voir aussi
|
(C++20)
|
retourne la plage d'éléments correspondant à une clé spécifique
(objet fonction algorithme) |
|
(C++20)
|
retourne un itérateur vers le premier élément
non inférieur
à la valeur donnée
(objet fonction algorithme) |
|
(C++20)
|
retourne un itérateur vers le premier élément
supérieur
à une certaine valeur
(objet fonction algorithme) |
|
(C++23)
(C++23)
|
vérifie si la plage contient l'élément ou la sous-plage donnée
(objet fonction algorithme) |
|
détermine si un élément existe dans une plage partiellement ordonnée
(modèle de fonction) |