Namespaces
Variants

std:: count, std:: count_if

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
(C++11) (C++11) (C++11)
count count_if

Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Definido en el encabezado <algorithm>
(1)
template < class InputIt, class T >

typename std:: iterator_traits < InputIt > :: difference_type

count ( InputIt first, InputIt last, const T & value ) ;
(constexpr desde C++20)
(hasta C++26)
template < class InputIt, class T = typename std:: iterator_traits

< InputIt > :: value_type >
constexpr typename std:: iterator_traits < InputIt > :: difference_type

count ( InputIt first, InputIt last, const T & value ) ;
(desde C++26)
(2)
template < class ExecutionPolicy, class ForwardIt, class T >

typename std:: iterator_traits < ForwardIt > :: difference_type
count ( ExecutionPolicy && policy,

ForwardIt first, ForwardIt last, const T & value ) ;
(desde C++17)
(hasta C++26)
template < class ExecutionPolicy,

class ForwardIt, class T = typename std:: iterator_traits
< ForwardIt > :: value_type >
typename std:: iterator_traits < ForwardIt > :: difference_type
count ( ExecutionPolicy && policy,

ForwardIt first, ForwardIt last, const T & value ) ;
(desde C++26)
template < class InputIt, class UnaryPred >

typename std:: iterator_traits < InputIt > :: difference_type

count_if ( InputIt first, InputIt last, UnaryPred p ) ;
(3) (constexpr desde C++20)
template < class ExecutionPolicy, class ForwardIt, class UnaryPred >

typename std:: iterator_traits < ForwardIt > :: difference_type
count_if ( ExecutionPolicy && policy,

ForwardIt first, ForwardIt last, UnaryPred p ) ;
(4) (desde C++17)

Devuelve el número de elementos en el rango [ first , last ) que satisfacen criterios específicos.

1) Cuenta los elementos que son iguales a value (usando operator == ).
3) Cuenta elementos para los cuales el predicado p devuelve true .
2,4) Igual que (1,3) , pero se ejecuta de acuerdo con la policy .
Estas sobrecargas participan en la resolución de sobrecarga solo si se cumplen todas las siguientes condiciones:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> es true .

(hasta C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> es true .

(desde C++20)

Contenidos

Parámetros

first, last - el par de iteradores que define el rango de elementos a examinar
value - el valor a buscar
policy - la política de ejecución a utilizar
p - predicado unario que devuelve ​ true para los elementos requeridos.

La expresión p ( v ) debe ser convertible a bool para cada argumento v de tipo (posiblemente const) VT , donde VT es el tipo de valor de InputIt , independientemente de la categoría de valor , y no debe modificar v . Por lo tanto, no se permite un tipo de parámetro VT & , ni tampoco VT a menos que para VT un movimiento sea equivalente a una copia (since C++11) . ​

Requisitos de tipo
-
InputIt debe cumplir con los requisitos de LegacyInputIterator .
-
ForwardIt debe cumplir con los requisitos de LegacyForwardIterator .
-
UnaryPred debe cumplir con los requisitos de Predicate .

Valor de retorno

El número de iteradores it en el rango [ first , last ) que satisfacen la siguiente condición:

1,2) * it == value es true .
3,4) p ( * it ) ! = false es true .

Complejidad

Dado N como std:: distance ( first, last ) :

1,2) Exactamente N comparaciones con value usando operator == .
3,4) Exactamente N aplicaciones del predicado p .

Excepciones

Las sobrecargas con un parámetro de plantilla llamado ExecutionPolicy reportan errores de la siguiente manera:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y ExecutionPolicy es uno de los standard policies , std::terminate es llamado. Para cualquier otro ExecutionPolicy , el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.

Notas

Para el número de elementos en el rango [ first , last ) sin criterios adicionales, consulte std::distance .

Macro de prueba de características Valor Estándar Característica
__cpp_lib_algorithm_default_value_type 202403 (C++26) Inicialización de lista para algoritmos ( 1,2 )

Implementación posible

Consulte también las implementaciones de count en libstdc++ y libc++ .

Consulte también las implementaciones de count_if en libstdc++ y 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;
}

Ejemplo

#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';
    // Determinar cuántos enteros coinciden con un valor objetivo.
    for (const int target : {3, 4, 5})
    {
        const int num_items = std::count(v.cbegin(), v.cend(), target);
        std::cout << "número: " << target << ", conteo: " << num_items << '\n';
    }
    // Usar una expresión lambda para contar elementos divisibles por 4.
    int count_div4 = std::count_if(v.begin(), v.end(), [](int i) { return i % 4 == 0; });
    std::cout << "números divisibles por cuatro: " << count_div4 << '\n';
    // Una versión simplificada de `distance` con complejidad 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 se deduce permitiendo la inicialización por lista
        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);
}

Salida:

v: 1 2 3 4 4 3 7 8 9 10
número: 3, conteo: 2
número: 4, conteo: 2
número: 5, conteo: 0
números divisibles por cuatro: 3

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 283 C++98 T se requería que fuera EqualityComparable , pero
el tipo de valor de InputIt no siempre es T
se eliminó el requisito

Véase también

devuelve la distancia entre dos iteradores
(plantilla de función)
devuelve el número de elementos que cumplen criterios específicos
(objeto función de algoritmo)