Espacios de nombres
Variantes

std::ranges::count, std::ranges::count_if

De cppreference.com
 
 
Biblioteca de algoritmos
Políticas de ejecución (C++17)
Operaciones de secuencia no modificantes
(C++11)(C++11)(C++11)
(C++17)
Operaciones de secuencia modificantes
Operaciones en almacenamiento no inicializado
Operaciones de partición
Operaciones de ordenación
(C++11)
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mínimo/máximo
(C++11)
(C++17)
Permutaciones
Operaciones numéricas
Bibliotecas C
 
Algoritmos restringidos
Operaciones de secuencia no modificantes
Operaciones de secuencia modificantes
Operaciones en almacenamiento sin inicializar
Operaciones de partición
Operaciones de ordenamiento
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de montículo/montón
Operaciones de mínimo/máximo
Permutaciones
 
<tbody> </tbody>
Definido en el archivo de encabezado <algorithm>
Signatura de la llamada
template< std::input_iterator I, std::sentinel_for<I> S, class T, class Proj = std::identity > requires std::indirect_binary_predicate<ranges::equal_to, std::projected<I, Proj>, const T*> constexpr std::iter_difference_t<I> count( I first, S last, const T& value, Proj proj = {} );
(1) (desde C++20)
template< ranges::input_range R, class T, class Proj = std::identity > requires std::indirect_binary_predicate<ranges::equal_to, std::projected<ranges::iterator_t<R>, Proj>, const T*> constexpr ranges::range_difference_t<R> count( R&& r, const T& value, Proj proj = {} );
(2) (desde C++20)
template< std::input_iterator I, std::sentinel_for<I> S, class Proj = std::identity, std::indirect_unary_predicate<std::projected<I, Proj>> Pred > constexpr std::iter_difference_t<I> count_if( I first, S last, Pred pred, Proj proj = {} );
(3) (desde C++20)
template< ranges::input_range R, class Proj = std::identity, std::indirect_unary_predicate<std::projected<ranges::iterator_t<R>, Proj>> Pred > constexpr ranges::range_difference_t<R> count_if( R&& r, Pred pred, Proj proj = {} );
(4) (desde C++20)

Devuelve el número de elementos en el rango [first, last) que satisfacen un criterio específico.

1) Cuenta el número de elementos que son iguales que value.
3) Cuenta el número de elementos para los que el predicado p devuelve true.
2,4) Igual que (1,3), pero usa r como el rango fuente, como si usara ranges::begin(r) como first y ranges::end(r) como last.

Las entidades similares a funciones descritas en esta página son niebloids, es decir:

En la práctica, pueden implementarse como objetos función o con extensiones de compilador especiales.

Parámetros

first, last - El rango de elementos a examinar.
r - El rango de elementos a examinar.
value - El valor a buscar.
pred - El predicado a aplicar a los elementos proyectados.
proj - La proyección a aplicar a los elementos.

Valor de retorno

El número de elementos que satisfacen la condición.

Complejidad

Exactamente last - first comparaciones y proyección.

Notas

Para el número de elementos en el rango sin criterio adicional, véase std::ranges::distance.

Posible implementación

Primera versión
struct count_fn {
  template< std::input_iterator I, std::sentinel_for<I> S,
          class T, class Proj = std::identity >
  requires std::indirect_binary_predicate<ranges::equal_to, std::projected<I, Proj>, 
                                        const T*>
  constexpr std::iter_difference_t<I>
    operator()( I first, S last, const T& value, Proj proj = {} ) const
  {
    std::iter_difference_t<I> counter = 0;
    for (; first != last; ++first) {
      if (std::invoke(proj, *first) == value)
      {
        ++counter;
      }
    }

    return counter;
  }

  template< ranges::input_range R, class T, class Proj = std::identity >
  requires std::indirect_binary_predicate<ranges::equal_to,
                                          std::projected<ranges::iterator_t<R>, Proj>,
                                          const T*>
  constexpr ranges::range_difference_t<R>
    operator()( R&& r, const T& value, Proj proj = {} ) const
  {
    return (*this)(ranges::begin(r), ranges::end(r), value, std::ref(proj));
  }
};

inline constexpr count_fn count;
Segunda versión
struct count_if_fn {
  template< std::input_iterator I, std::sentinel_for<I> S,
            class Proj = std::identity,
            std::indirect_unary_predicate<std::projected<I, Proj>> Pred >
  constexpr std::iter_difference_t<I>
    operator()( I first, S last, Pred pred, Proj proj = {} ) const
  {
    std::iter_difference_t<I> counter = 0;
    for (; first != last; ++first) {
      if (std::invoke(pred, std::invoke(proj, *first)))
      {
        ++counter;
      }
    }

    return counter;
  }

  template< ranges::input_range R, class Proj = std::identity,
            std::indirect_unary_predicate<std::projected<ranges::iterator_t<R>, Proj>> Pred >
  constexpr ranges::range_difference_t<R>
    operator()( R&& r, Pred pred, Proj proj = {} ) const
  {
    return (*this)(ranges::begin(r), ranges::end(r),
                   std::ref(pred), std::ref(proj));
  }
};

inline constexpr count_if_fn count_if;

Ejemplo

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v{ 1, 2, 3, 4, 4, 3, 7, 8, 9, 10 };

    namespace ranges = std::ranges;

    // determinar cuántos enteros en un std::vector coinciden con un valor objetivo.
    int objetivo1 = 3;
    int objetivo2 = 5;
    int num_items1 = ranges::count(v.begin(), v.end(), objetivo1);
    int num_items2 = ranges::count(v, objetivo2);
    std::cout << "número: " << objetivo1 << " cuenta: " << num_items1 << '\n';
    std::cout << "número: " << objetivo2 << " cuenta: " << num_items2 << '\n';

    // usar una expresión lambda para contar elementos divisibles por 3.
    int num_items3 = ranges::count_if(v.begin(), v.end(), [](int i){return i % 3 == 0;});
    std::cout << "número de divisibles por tres: " << num_items3 << '\n';

    // usar una expresión lambda para contar elementos divisibles por 11.
    int num_items11 = ranges::count_if(v, [](int i){return i % 11 == 0;});
    std::cout << "número de divisibles por once: " << num_items11 << '\n';
}

Salida:

número: 3 cuenta: 2
número: 5 cuenta: 0
número de divisibles por tres: 3
número de divisibles por once: 0

Véase también

Devuelve la distancia entre un iterador y un centinela, o entre el principio y el fin de un rango.
(niebloid) [editar]
Crea un subrango a partir de un iterador y una cuenta.
(objeto punto de personalización) [editar]
Una vista (view) que consiste en los elementos de un rango (range) que satisface un predicado.
(plantilla de clase) (objeto adaptador de rango) [editar]
Devuelve el número de elementos que cumplan con un criterio específico.
(plantilla de función) [editar]