Manipulation de données - Itération et transformation
Itération et transformation
Les algorithmes de transformation et d’itération de la bibliothèque standard font partie des plus utiles puisqu’ils permettent d’effectuer un traitement sur l’ensemble des éléments d’un conteneur. Ces traitements peuvent modifier ou non ces éléments ou tout simplement calculer une valeur à partir de ces éléments.Les deux principaux algorithmes fournis par la bibliothèque standard sont sans doute les algorithmes for_each et transform, qui permettent d’effectuer une action sur chaque élément d’un conteneur. Ces algorithmes sont déclarés comme suit dans l’en-tête <algorithm> :
template <class InputIterator, class Function> Function for_each(InputIterator premier, InputIterator dernier, Function f); template <class InputIterator, class OutputIterator, class UnaryOperation> OutputIterator transform(InputIterator premier, InputIterator dernier, OutputIterator destination, UnaryOperation op); template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation> OutputIterator transform(InputIterator1 premier1, InputIterator1 dernier1, InputIterator2 premier2, OutputIterator destination, BinaryOperation op);
L’algorithme for_each permet de parcourir les éléments d’un conteneur et d’appeler une fonction pour chacun de ces éléments, mais il ne peut pas les modifier.
transform
Contrairement à for_each, l’algorithme transform autorise la modification des éléments du conteneur sur lequel il travaille. Il est fourni sous deux versions, la première permettant d’appliquer un foncteur unaire sur chaque élément d’un conteneur et la seconde un foncteur binaire sur deux éléments de deux conteneurs sur lesquels l’algorithme itère simultanément.Code 9.9 : algorithmes d’itération
#include <iostream> #include <functional> #include <algorithm> using namespace std; void aff_entier(int i) { cout << i << "\t"; } int main() { int tab[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; //On inverse tous les éléments du tableau : transform(tab, tab+10, tab, negate<int>()); //On affiche le résultat : for_each(tab, tab+10, ptr_fun(&aff_entier)); }
Comme vous pouvez le constater d’après cet exemple, il est tout à fait possible d’utiliser la même valeur pour l’itérateur premier et l’itérateur destination. Cela signifie que les éléments itérés peuvent être remplacés par les nouvelles valeurs calculées par le foncteur fourni à l’algorithme transform.
Le texte original de cette fiche pratique est extrait de
«Tout sur le C++» (Christine EBERHARDT, Collection
CommentCaMarche.net, Dunod, 2009)