2012-09-24 13 views
12

Duplicar posible:
Why does the C++ standard algorithm “count” return a ptrdiff_t instead of size_t?¿Por qué std :: count (_if) devuelve iterator :: difference_type en vez de size_t?

Hay algoritmo std::count/std::count_if en C++ estándar.

template<class InputIterator, class T> 
typename iterator_traits<InputIterator>::difference_type 
count(InputIterator first, InputIterator last, const T& value); 

template<class InputIterator, class Predicate> 
typename iterator_traits<InputIterator>::difference_type 
count_if(InputIterator first, InputIterator last, Predicate pred); 

Efectos: Devuelve el número de iteradores i en el rango [primero, último) para los que tienen las siguientes condiciones correspondientes : Valor * i ==, pred (* i) = false!.

difference_type es iterator's difference_type, que puede ser negativo, pero puede volver count único valor> = 0. Por qué difference_type y no size_t por ejemplo?

Respuesta

12

En teoría, puede tener una secuencia tremenda cuyo número de elementos solo se puede representar con 128 bits. Suponiendo que la implementación admite un tipo entero correspondiente, es bastante probable que size_t use un tipo de 64 bits. Sin embargo, el iterador de esta gran secuencia podría usar un entero de 128 bits. Tenga en cuenta que la secuencia no es necesaria y está representada en la memoria de cualquier computadora individual. Se puede dividir en múltiples bases de datos enormes.

Es posible que también tenga una computadora relativamente pequeña que solo admita un tipo de 32 bits con un rendimiento razonable. Para una conformidad estándar completa, podría tener que admitir un tipo de 64 bits, pero puede ser conveniente admitir cálculos más rápidos utilizando una representación respaldada nativamente por la plataforma. Es decir, size_t puede no ser la elección óptima. Al crear iteradores, generalmente se sabe qué tamaño debe admitirse.

+0

Gracias, gran explicación. – ForEveR

+1

@DietmarKuehl Pero ¿por qué 'iterator_traits :: difference_type' es una mejor opción? En la mayoría de los casos, se trata de un entero con signo de 8 bytes, que ya desglosa el argumento de que 'size_t' (entero de 8 bytes sin signo) puede no ser lo suficientemente grande. –

+2

@GrimFandango: ¿Cómo afectan las elecciones hechas para otros iteradores a mi elección de 'TremendousIterator :: difference_type'? El punto es que el uso de 'std :: size_t' evitaría que casos especiales usen opciones especiales mientras que el uso del tipo anidado permite tomar decisiones adecuadas. –

Cuestiones relacionadas