Pourquoi effectuer la sommation vers l'avant lorsque vous pouvez le faire en arrière? Étant donné :
std::vector v; // vecteur à sommer
int sum_of_elements(0); // résultat de la sommation
Nous pouvons utiliser le subscipting, en comptant à rebours :
for (int i(v.size()); i > 0; --i)
sum_of_elements += v[i-1];
Nous pouvons utiliser le "subscripting" vérifié, en comptant à rebours (au cas où) :
for (int i(v.size()); i > 0; --i)
sum_of_elements += v.at(i-1);
Nous pouvons utiliser des itérateurs inverses dans une boucle for :
for(std::vector::const_reverse_iterator i(v.rbegin()); i != v.rend(); ++i)
sum_of_elements += *i;
Nous pouvons utiliser des itérateurs avancés, en itérant à l'envers, dans une boucle for (oh, délicat!) :
for(std::vector::const_iterator i(v.end()); i != v.begin(); --i)
sum_of_elements += *(i - 1);
Nous pouvons utiliser accumulate
avec des itérateurs inverses :
sum_of_elems = std::accumulate(v.rbegin(), v.rend(), 0);
Nous pouvons utiliser for_each
avec une expression lambda en utilisant des itérateurs inverses :
std::for_each(v.rbegin(), v.rend(), [&](int n) { sum_of_elements += n; });
Donc, comme vous pouvez le voir, il existe tout autant de façons de sommer le vecteur en arrière que de le sommer en avant, et certaines de ces façons sont beaucoup plus excitantes et offrent beaucoup plus d'opportunités pour des erreurs d'un élément.
2 votes
"Combien"? Vraiment? Cela semble être une question trop vague. :p Il serait peut-être plus utile de demander une bonne manière de le faire.
3 votes
Que voulez-vous dire lorsque vous dites "fonction similaire à ?" Cherchez-vous un remplacement pour
std::accumulate
dans Boost? (Si oui, pourquoi?) Cherchez-vous des fonctions qui font quelque chose de similaire àstd::accumulate
? (Si oui, quoi?)4 votes
Si vous voulez quelque chose de similaire à
std::accumulate
, vous voulez probablement aussi qu'il soit différent à certains égards (sinon vous pourriez simplement utiliserstd::accumulate
) ; quel(s) différence(s) par rapport àstd::accumulate
recherchez-vous?