¿Por qué realizar la suma hacia adelante cuando puedes hacerlo al revés ? Dado:
std::vector<int> v; // vector to be summed
int sum_of_elements(0); // result of the summation
Podemos usar suscripciones, contando hacia atrás:
for (int i(v.size()); i > 0; --i)
sum_of_elements += v[i-1];
Podemos usar "suscripciones" controladas por rango, contando hacia atrás (por si acaso)
for (int i(v.size()); i > 0; --i)
sum_of_elements += v.at(i-1);
Podemos usar iteradores inversos en un ciclo for:
for(std::vector<int>::const_reverse_iterator i(v.rbegin()); i != v.rend(); ++i)
sum_of_elements += *i;
Podemos usar iteradores hacia adelante, iterando hacia atrás, en un bucle for (¡oooh, complicado!):
for(std::vector<int>::const_iterator i(v.end()); i != v.begin(); --i)
sum_of_elements += *(i - 1);
Podemos usar accumulate
con iteradores inversos:
sum_of_elems = std::accumulate(v.rbegin(), v.rend(), 0);
Podemos usar for_each
con una expresión lambda usando iteradores inversos:
std::for_each(v.rbegin(), v.rend(), [&](int n) { sum_of_elements += n; });
Por lo tanto, como puede ver, hay tantas formas de sumar el vector hacia atrás como de sumar el vector hacia adelante, y algunas de ellas son mucho más emocionantes y ofrecen muchas más oportunidades para errores fuera de uno.