Ce qui suit présume que vous avez compris les techniques derrière le calcul de la moyenne générique à partir de traits et d'algorithmes standards. À titre de rappel, voici un exemple de calcul de la moyenne d'une séquence numérique à partir de cette combinaison de techniques. |
|
Comment réaliserons-nous l'écart type? À partir de la formule générale, soit , où la sommation peut être exprimée par un appel à std::accumulate(), où est la moyenne des éléments de la séquence et où est le nombre d'éléments dans la séquence (ce que nous pouvons évaluer par std::distance()). Notez que l'algorithme doit échouer si pour éviter une division par zéro.
La partie lourde du travail, si nous choisissons d'exprimer les termes dans la sommation à l'aide d'un foncteur écrit manuellement, est justement la rédaction du foncteur en question. Notez le recours à CTAD pour alléger la syntaxe dans le code client. Le calcul de l'écart type lui même se résout en une seule expression, comme le montre l'exemple à droite, et le programme de test est à la fois simple et exact. |
|
Il est bien sûr possible de réduire la complexité de l'expression de l'écart type en passant par une λ-expression plutôt que par un foncteur écrit à la main.
Examinons l'expression en détail :
Voilà! |
|
Qu'en pensez-vous? Il reste une optimisation possible, si vous en avez envie soit celle qui réduirait le nombre de parcours de la séquence à un seul (plutôt que deux) si les itérateurs sont de catégorie forward_iterator_tag ou bidirectional_iterator_tag. Amusez-vous bien!