Pourquoi effectuer la sommation en avant quand vous pouvez le faire en arrière? Donné :
std::vector v; // vecteur à sommer
int somme_des_elements(0); // résultat de la sommation
Nous pouvons utiliser la méthode de l'indexation, en comptant à rebours :
for (int i(v.size()); i > 0; --i)
somme_des_elements += v[i-1];
Nous pouvons utiliser la méthode de "l'indexation" vérifiée avec des limites, en comptant à rebours (au cas où) :
for (int i(v.size()); i > 0; --i)
somme_des_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)
somme_des_elements += *i;
Nous pouvons utiliser des itérateurs directs, en itérant à rebours, dans une boucle for (oooh, astucieux!) :
for(std::vector::const_iterator i(v.end()); i != v.begin(); --i)
somme_des_elements += *(i - 1);
Nous pouvons utiliser accumulate
avec des itérateurs inverses :
somme_des_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) { somme_des_elements += n; });
Donc, comme vous pouvez le voir, il y a autant de façons de sommer le vecteur en arrière que de le faire en avant, et certaines de ces façons sont beaucoup plus excitantes et offrent beaucoup plus d'opportunités d'erreurs de décalage d'un élément.
2 votes
"Combien"? Vraiment? Cette question semble trop vague. :p Il serait peut-être plus utile de demander une bonne façon de le faire.
3 votes
Que voulez-vous dire quand 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 que cela soit différent d'une manière ou d'une autre (sinon vous pourriez simplement utiliserstd::accumulate
); quelles différences destd::accumulate
recherchez-vous?