Perché eseguire la somma in avanti quando è possibile farlo all'indietro ? Dato:
std::vector<int> v; // vector to be summed
int sum_of_elements(0); // result of the summation
Possiamo usare la sottoscrizione, contando all'indietro:
for (int i(v.size()); i > 0; --i)
sum_of_elements += v[i-1];
Possiamo usare la "sottoscrizione" controllata dal range, contando all'indietro (per ogni evenienza):
for (int i(v.size()); i > 0; --i)
sum_of_elements += v.at(i-1);
Possiamo usare iteratori inversi in un ciclo for:
for(std::vector<int>::const_reverse_iterator i(v.rbegin()); i != v.rend(); ++i)
sum_of_elements += *i;
Possiamo usare iteratori in avanti, ripetendo indietro, in un ciclo for (oooh, difficile!):
for(std::vector<int>::const_iterator i(v.end()); i != v.begin(); --i)
sum_of_elements += *(i - 1);
Possiamo usare accumulate
con iteratori inversi:
sum_of_elems = std::accumulate(v.rbegin(), v.rend(), 0);
Possiamo usare for_each
con un'espressione lambda usando iteratori inversi:
std::for_each(v.rbegin(), v.rend(), [&](int n) { sum_of_elements += n; });
Quindi, come puoi vedere, ci sono tanti modi per sommare il vettore all'indietro quanti sono per sommare il vettore in avanti, e alcuni di questi sono molto più eccitanti e offrono opportunità molto maggiori per errori off-by-one.