Como la función aceptado por for_each tomar sólo un parámetro (el elemento del vector), tengo que definir un static int sum = 0
en algún lugar de modo que se puede acceder después de llamar al for_each . Creo que esto es incomodo ¿Alguna mejor manera de hacer esto (aún usar for_each)?suma de cuadrados de cada uno de los elementos en el vector usando for_each
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
static int sum = 0;
void add_f(int i)
{
sum += i * i;
}
void test_using_for_each()
{
int arr[] = {1,2,3,4};
vector<int> a (arr ,arr + sizeof(arr)/sizeof(arr[0]));
for_each(a.begin(),a.end(), add_f);
cout << "sum of the square of the element is " << sum << endl;
}
En Ruby, podemos hacerlo de esta manera:
sum = 0
[1,2,3,4].each { |i| sum += i*i} #local variable can be used in the callback function
puts sum #=> 30
podría por favor mostrar más ejemplos de cómo for_each
se utiliza normalmente en la programación práctica (no sólo imprimir cada elemento)? ¿Es posible usar for_each
simular 'patrón de programación' como mapa e inyectar en Ruby (o mapa/plegar en Haskell).
#map in ruby
>> [1,2,3,4].map {|i| i*i}
=> [1, 4, 9, 16]
#inject in ruby
[1, 4, 9, 16].inject(0) {|aac ,i| aac +=i} #=> 30
EDIT: Gracias a todos. He aprendido mucho de tus respuestas. Tenemos muchas maneras de hacer lo mismo en C++, lo que hace que sea un poco difícil de aprender. Pero es interesante :)
No creo iteradores de vectores están garantizados para estar en el espacio de nombres std. Si eso es correcto, entonces no se garantiza que ADL funcione aquí, y el que pregunta no ha especificado un compilador. –
Tienes razón. Acabo de comprobar: el estándar no garantiza que el iterador sea parte del espacio de nombres estándar. Solo los iteradores inversos son parte del espacio de nombres 'std'. –
onebyone: Guau, buena captura. Revisé el estándar y tienes toda la razón. Por ejemplo, si vector :: iterator fue typedefed a T *, ADL fallaría. -1ing para obtener la atención del OP ... (La publicación es por lo demás excelente BTW.) –