Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Fonction std::copy

Entête à inclure

#include <algorithm>

Fonction std::copy

template <typename ITSrc, typename ITDest>
ITDest std::copy( ITSrc begin, ITSrc end, ITDest destination );

Cette fonction permet de copier tous (ou un partie) des éléments d'un container dans un autre. Pour que cela puisse fonctionner, les deux conteneurs (la collection source et la collection destination) doivent être "compatible STL" : en d'autres termes, ils doivent supporter le concept d'itérateurs.

Au niveau de la STL (Standard Template Library), beaucoup de concepts fournissent des itérateurs et donc peuvent être vus comme des conteneurs et notamment les classes std::vector, std::list, les classes de streams (std::istream, std:ostream), std::string, ... Citons aussi les tableaux classiques (à la C), étant donné qu'un itérateur doit se comporter comme un pointeur. Vous pouvez donc utiliser cet algorithme sur toutes ces conteneurs.

Paramètres

  • begin : un itérateur qui cible le premier élément à copier.
  • end : un itérateur placé après le dernier élément à copier.
  • destination : un itérateur sur la collection de destination.

Valeur de retour

Cette fonction renvoie un itérateur sur le conteneur de destination. Cet itérateur sera placé après le dernier élément copié.

Exemple de code

#include <algorithm>
#include <iostream>
#include <iterator>
#include <fstream>
#include <vector>

using namespace std;

/* std::copy implementation is like this.

template <typename ITS, typename ITD>
inline ITD copy2( ITS current, ITS end, ITD dest ) {
    while( current != end ) {
        *dest ++ = *current ++;
    }
    return dest;
}

*/

int main() {

    ifstream source( "input.txt" );
    istream_iterator<int> start( source );
    istream_iterator<int> end;

    vector<int> v;
    back_insert_iterator< vector<int> > dest( v );

    copy( start, end, dest );
    sort( v.begin(), v.end());

    copy( v.begin(), v.end(), ostream_iterator<int>( cout, "-" ) );
    cout << endl;
    
    return 0;
}

Afin de pouvoir tester cet exemple, veuillez préalablement créer un fichier texte appelé input.txt. Vous pouvez, par exemple, y placer le contenu suivant : 52 12 63 98 74 1 32 65 42 68 3 12 36 2 88. Au termes de l'exécution de ce programme, toutes les valeurs devraient être affichées à l'écran, et dans l'ordre croissant (grâce à l'appel à std::sort).

Sujets connexes