Manipulation de données - Copie
Copie
La bibliothèque standard définit les deux algorithmes copy et copy_backward pour réaliser la copie des données des conteneurs. Ces algorithmes sont disponibles avec le fichier en-tête <algorithm>.copy réalise une copie de tous les objets situés entre deux éléments dont il reçoit les références, du premier au dernier, dans le conteneur cible fourni en troisième argument.
L’algorithme copy_backward travaille dans le sens contraire.
copy et copy_backward
Voici la déclaration de ces deux algorithmes dans la STL :template <class InputIterator, class OutputIterator> OutputIterator copy(InputIterator premier, InputIterator dernier, OutputIterator destination); template <class BidirectionalIterator1, class BidirectionalIterator2> BidirectionalIterator2 copy_backward( BidirectionalIterator1 premier, BidirectionalIterator1 dernier, BidirectionalIterator2 fin_destination);
À savoir
InputIterator est un itérateur d’entrée. Un itérateur d’entrée est un itérateur qui doit être constructible par défaut (il doit posséder un constructeur par défaut de sorte qu’on puisse le créer sans avoir besoin de l’initialiser avec une valeur particulière), à qui nous devons pouvoir affecter une valeur (il doit posséder un constructeur de copie et un opérateur d’affectation surchargé), et il doit posséder un opérateur d’égalité surchargé == et un opérateur d’inégalité != (pour comparer deux itérateurs).Un itérateur d’entrée est un itérateur sur lequel nous pouvons appliquer l’indirection alors qu’il pointe sur un élément d’une séquence. L’itérateur peut aussi pointer sur la fin d’une séquence. Dans ce cas, il pointe en réalité juste après l’élément final de la séquence. On dit qu’il est après-la-fin. Nous ne pouvons appliquer l’indirection à un itérateur après-la-fin.
Un itérateur d’entrée est valide si nous parvenons à obtenir un objet valide en lui appliquant l’indirection ou s’il se trouve après la fin. Un itérateur d’entrée garantit les accès en lecture pour l’objet pointé.
OutputIterator est un itérateur de sortie. Un itérateur de sortie doit être constructible par défaut, et nous devons pouvoir lui attribuer une valeur. Cet itérateur garantit les accès en écriture – mais non les accès en lecture – sur l’objet pointé.
Le code 9.2 illustre ces deux types de copie.
Code 9.2 : algorithmes de copie
#include <iostream> #include <algorithm> #include <cstring> //pour la fonction strlen() using namespace std; int main() { char chaine[] = "abcdefg123"; cout << "Voici la chaine initiale: " << chaine << endl; //On repère la fin de la chaîne en mémoire: //char *p_debut = chaine; char *p_fin = chaine + strlen(chaine); //On recopie les 3 derniers caractères au début de la chaîne copy(p_fin-3, p_fin, chaine); //On affiche le résultat : cout <<"On recopie les 3 derniers caractères au début de la chaîne: "; cout << chaine << endl; //On écrase la chaîne par elle-même à partir du 4ème élément : copy_backward(chaine, p_fin-3, p_fin); // On affiche le résultat : cout << "On écrase la chaîne par elle-même à partir du 4ème élément: " cout <<chaine << endl; }
On obtient :
Voici la chaîne initiale: abcdefg123 On recopie les 3 derniers caractères au début de la chaîne: 123defg123 On écrase la chaîne par elle-même à partir du 4ième élément: 123123defg
À savoir
La fonction strlen() est une des fonctions de la bibliothèque C standard, qui est déclarée dans l’en-tête <cstring>. Elle permet de calculer la longueur d’une chaîne de caractères C (sans compter le caractère nul de fin).Le texte original de cette fiche pratique est extrait de
«Tout sur le C++» (Christine EBERHARDT, Collection
CommentCaMarche.net, Dunod, 2009)