Po co przeprowadzać sumowanie do przodu, skoro można to zrobić wstecz ? Dany:
std::vector<int> v; // vector to be summed
int sum_of_elements(0); // result of the summation
Możemy użyć indeksowania, odliczając wstecz:
for (int i(v.size()); i > 0; --i)
sum_of_elements += v[i-1];
Możemy użyć sprawdzania zakresu „indeksowania”, odliczając wstecz (na wszelki wypadek):
for (int i(v.size()); i > 0; --i)
sum_of_elements += v.at(i-1);
Możemy użyć iteratorów odwrotnych w pętli for:
for(std::vector<int>::const_reverse_iterator i(v.rbegin()); i != v.rend(); ++i)
sum_of_elements += *i;
Możemy używać iteratorów do przodu, iterujących do tyłu, w pętli for (oooh, trudne!):
for(std::vector<int>::const_iterator i(v.end()); i != v.begin(); --i)
sum_of_elements += *(i - 1);
Możemy używać accumulate
z iteratorami wstecznymi:
sum_of_elems = std::accumulate(v.rbegin(), v.rend(), 0);
Możemy użyć for_each
wyrażenia lambda przy użyciu iteratorów odwrotnych:
std::for_each(v.rbegin(), v.rend(), [&](int n) { sum_of_elements += n; });
Tak więc, jak widać, istnieje tak samo wiele sposobów na sumowanie wektora do tyłu, jak i na sumowanie wektora do przodu, a niektóre z nich są znacznie bardziej ekscytujące i oferują znacznie większą szansę na błędy indywidualne.