Pourquoi faire la somme en avant quand vous pouvez le faire en arrière? Donné :
std::vector v; // vecteur à additionner
int sum_of_elements(0); // résultat de l'addition
Nous pouvons utiliser le sous-scriptage, en comptant à rebours :
for (int i(v.size()); i > 0; --i)
sum_of_elements += v[i-1];
Nous pouvons utiliser le "sous-scriptage" avec vérification de la plage, 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 avant, en itérant à rebours, dans une boucle for (oh, malin!) :
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 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 y a autant de façons d'additionner le vecteur à rebours que de façons de l'additionner en avant, et certaines d'entre elles sont bien plus passionnantes et offrent bien plus d'opportunités pour des erreurs de décalage 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 façon de le faire.
3 votes
Que voulez-vous dire lorsque vous dites "fonction similaire à?" Êtes-vous à la recherche d'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 qu'il soit différent à certains égards (sinon vous pourriez simplement utiliserstd::accumulate
); quelles différences par rapport àstd::accumulate
recherchez-vous?