Participer au site avec un Tip
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_backward

Entête à inclure

#include <algorithm>

Fonction std::copy_backward

template <typename ITSrc, typename ITDest>
ITDest std::copy_backward( 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.

La différence avec la fonction générique std::copy réside dans le fait que std::copy_backward copie les éléments à partir de la fin des deux collections vers le début (et non du début vers la fin). Au terme de la copie, tous les éléments se retrouvent bien dans le bon ordre dans la collection de destination. La fonction std:copy_backward renvie un itérateur vers le premier élément de la collection de destination (le dernier élément copié).

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 initialisé aprés la dernière donnée à copier.

Valeur de retour

Cette fonction renvoie un itérateur sur le premier élément de la collection de destination.

Exemple de code

#include <algorithm>
#include <cassert>
#include <iostream>
#include <iterator>
#include <list>
#include <string>
#include <vector>

using namespace std;

/* std::copy_backward implementation is like this.

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

*/

int main() {

    vector<string> v;
    v.push_back( "C" );
    v.push_back( "C++" );
    v.push_back( "Objective C" );
    v.push_back( "Java" );
    v.push_back( "C#" );

    list<string> dest;
    dest.resize( v.size() );

    list<string>::iterator result = 
                copy_backward( v.begin(), v.end(), dest.end() );
    assert( result == dest.begin() );

    for( const string & strLanguage : dest ) {
        cout << strLanguage << ", ";
    }     
    cout << endl;
     
    return 0;
}

Vous l'avez peut être remarqué, ce exemple de code présuppose que vous utilisiez un compilateur compatible avec le standard C++11 (utilisation de l'instruction for sur collection, autrement dit un for each). Pour les utilisateurs de g++, exécutez la ligne de commande suivante : g++ -std=c++11 -o Sample Sample.cpp. Pour tout autre compilateur, vérifiez qu'il soit compatible C++11 au niveau de sa documentation.

Sujets connexes