lunes, 22 de diciembre de 2014

C++ accumulate

Este es un pequeño tip que se me hizo interesante. Veamos el siguiente codigo:

Imprime lo siguiente:
resultado= 987459712
resultado= 5000000050000000

El segundo resultado es el correcto.

Cuando usamos, por ejemplo, contenedores de la STL, tenemos que especificar el tipo del elemento que queremos, por ejemplo: vector<double>. Pero en el caso de los algoritmos de la STL, por default se basan en los argumentos. En el caso anterior, el compilador deduce para el primer accumulate que queremos un tipo entero para guardar el resultado final, lo cual causa un overflow cuando se suman todos los elementos.

Para el segundo accumulate, gracias a que usamos 0L, el compilador deduce correctamente que queremos usar un long para guardar el resultado de la suma.

Esto es mas aparente cuando vemos en la referencia que esta función usa el tercer parámetro para deducir que tipo usar para acumular el resultado final.

Saludos.

No hay comentarios:

Publicar un comentario