Manipulation de données - Itération et transformation

Décembre 2016

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)

A voir également :

Ce document intitulé «  Manipulation de données - Itération et transformation  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.