2011-10-09 18 views
12

¿Cuál es la mejor manera de contar todos los elementos en un iterador?¿Cuántos elementos hay entre dos iteradores?

Quiero código equivalente a este

template<typename T,typename S,S val> 
struct ConstantFunctor : unary_function<T,S> 
{S operator()(const T&) const {return val;}}; 
template<typename T> 
struct TrueFunctor : ConstantFunctor<T,bool,true>{}; 
... 
count_if(c.begin(),c.end(),TrueFunctor()); 

Cuál es la mejor manera de hacerlo?

Puedo usar boost::lambda::constant(true), pero tal vez haya algo más claro.

+2

¿Por qué no usas 'std :: distance'? – Vinzenz

+0

@Vinzenz Eso es lo que estaba buscando ... Thaks –

+0

Para mí * contar todos los elementos entre dos iteradores * suena como obtener los valores de los elementos y resumirlos, que es 'acumular'. Si lo que quiere saber es * cuántos elementos hay en el rango * Creo que sería beneficioso si cambiara el título de la pregunta. –

Respuesta

25

Si desea contar todos los elementos de un rango. entonces usted puede utilizar std::distance, desde la cabecera <iterator>, así:

int count = std::distance(begin(c), end(c)); 

debería ser suficiente.

El online doc dice acerca std::distance:

calcula el número de elementos entre la primera y la última.

+0

la edición es incorrecta sin una etiqueta C++ 11 que falta aquí – davidhigh

+4

@davidhigh: Esto es 2015, y se lanza C++ 14, por lo que el significado por defecto de C++ debe ser C++ 14, a menos que se mencione la versión. – Nawaz

Cuestiones relacionadas