std:: count, std:: count_if
|
Défini dans l'en-tête
<algorithm>
|
||
| (1) | ||
|
template
<
class
InputIt,
class
T
>
typename
std::
iterator_traits
<
InputIt
>
::
difference_type
|
(constexpr depuis C++20)
(jusqu'à C++26) |
|
|
template
<
class
InputIt,
class
T
=
typename
std::
iterator_traits
<
InputIt
>
::
value_type
>
|
(depuis C++26) | |
| (2) | ||
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
T
>
typename
std::
iterator_traits
<
ForwardIt
>
::
difference_type
|
(depuis C++17)
(jusqu'à C++26) |
|
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
T
=
typename
std::
iterator_traits
|
(depuis C++26) | |
|
template
<
class
InputIt,
class
UnaryPred
>
typename
std::
iterator_traits
<
InputIt
>
::
difference_type
|
(3) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
UnaryPred
>
typename
std::
iterator_traits
<
ForwardIt
>
::
difference_type
|
(4) | (depuis C++17) |
Retourne le nombre d'éléments dans la plage
[
first
,
last
)
satisfaisant des critères spécifiques.
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true . |
(jusqu'à C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true . |
(depuis C++20) |
Table des matières |
Paramètres
| first, last | - | la paire d'itérateurs définissant la plage d'éléments à examiner |
| value | - | la valeur à rechercher |
| policy | - | la politique d'exécution à utiliser |
| p | - |
prédicat unaire qui retourne
true
pour les éléments requis.
L'expression
p
(
v
)
doit être convertible en
bool
pour chaque argument
|
| Exigences de type | ||
-
InputIt
doit satisfaire aux exigences de
LegacyInputIterator
.
|
||
-
ForwardIt
doit satisfaire aux exigences de
LegacyForwardIterator
.
|
||
-
UnaryPred
doit satisfaire aux exigences de
Predicate
.
|
||
Valeur de retour
Le nombre d'itérateurs
it
dans la
plage
[
first
,
last
)
satisfaisant la condition suivante :
Complexité
Étant donné N comme std:: distance ( first, last ) :
Exceptions
Les surcharges avec un paramètre de modèle nommé
ExecutionPolicy
signalent les erreurs comme suit :
-
Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que
ExecutionPolicyfait partie des politiques standard , std::terminate est appelé. Pour tout autreExecutionPolicy, le comportement est défini par l'implémentation. - Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.
Notes
Pour le nombre d'éléments dans l'intervalle
[
first
,
last
)
sans critères supplémentaires, voir
std::distance
.
| 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 de
count
dans
libstdc++
et
libc++
.
Voir également les implémentations de
count_if
dans
libstdc++
et
libc++
.
| count (1) |
|---|
template<class InputIt, class T = typename std::iterator_traits<InputIt>::value_type> typename std::iterator_traits<InputIt>::difference_type count(InputIt first, InputIt last, const T& value) { typename std::iterator_traits<InputIt>::difference_type ret = 0; for (; first != last; ++first) if (*first == value) ++ret; return ret; } |
| count_if (3) |
template<class InputIt, class UnaryPred> typename std::iterator_traits<InputIt>::difference_type count_if(InputIt first, InputIt last, UnaryPred p) { typename std::iterator_traits<InputIt>::difference_type ret = 0; for (; first != last; ++first) if (p(*first)) ++ret; return ret; } |
Exemple
#include <algorithm> #include <array> #include <cassert> #include <complex> #include <iostream> #include <iterator> int main() { constexpr std::array v{1, 2, 3, 4, 4, 3, 7, 8, 9, 10}; std::cout << "v: "; std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; // Déterminer combien d'entiers correspondent à une valeur cible for (const int target : {3, 4, 5}) { const int num_items = std::count(v.cbegin(), v.cend(), target); std::cout << "nombre: " << target << ", comptage: " << num_items << '\n'; } // Utiliser une expression lambda pour compter les éléments divisibles par 4 int count_div4 = std::count_if(v.begin(), v.end(), [](int i) { return i % 4 == 0; }); std::cout << "nombres divisibles par quatre: " << count_div4 << '\n'; // Une version simplifiée de `distance` avec complexité O(N) : auto distance = [](auto first, auto last) { return std::count_if(first, last, [](auto) { return true; }); }; static_assert(distance(v.begin(), v.end()) == 10); std::array<std::complex<double>, 3> nums{{{4, 2}, {1, 3}, {4, 2}}}; #ifdef __cpp_lib_algorithm_default_value_type // T est déduit permettant l'initialisation par liste auto c = std::count(nums.cbegin(), nums.cend(), {4, 2}); #else auto c = std::count(nums.cbegin(), nums.cend(), std::complex<double>{4, 2}); #endif assert(c == 2); }
Sortie :
v: 1 2 3 4 4 3 7 8 9 10 nombre: 3, comptage: 2 nombre: 4, comptage: 2 nombre: 5, comptage: 0 nombres divisibles par quatre: 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 283 | C++98 |
T
devait être
EqualityComparable
, mais
le type de valeur de
InputIt
n'est pas toujours
T
|
a supprimé l'exigence |
Voir aussi
|
renvoie la distance entre deux itérateurs
(modèle de fonction) |
|
|
(C++20)
(C++20)
|
renvoie le nombre d'éléments satisfaisant des critères spécifiques
(objet fonction algorithme) |