Partager via


uninitialized_copy

Objets de copies d'une plage source spécifiée dans une plage non initialisé de destination.

template<class InputIterator, class ForwardIterator>
   ForwardIterator uninitialized_copy(
      InputIterator _First, 
      InputIterator _Last,
      ForwardIterator _Dest
   );

Paramètres

  • _First
    Un itérateur d'entrée adressant le premier élément de la plage source.

  • _Last
    Un itérateur d'entrée adressant le dernier élément dans la plage source.

  • _Dest
    Un itérateur vers l'avant adressant le premier élément de la plage de destination.

Valeur de retour

Un itérateur vers l'avant adressant la première position au delà de la plage de destination, à moins que la plage source a été vide et des itérateurs d'adresses _First.

Notes

Cet algorithme permet le découplage de l'allocation de mémoire de la construction d'objet.

La fonction de modèle exécute efficacement :

while ( _First!= _Last )
   new ( ( void * )&*_Dest ++)
      iterator_traits<InputIterator>::value_type ( *_First ++ );
return _First;

à moins que le code lève une exception.Dans ce cas, tous les objets construits sont détruits et l'exception est à nouveau levée.

uninitialized_copy a deux formes associées :

checked_uninitialized_copy

unchecked_uninitialized_copy

Pour plus d'informations sur la façon dont ces fonctions se comportent, consultez Itérateurs vérifiés.

Exemple

// memory_uninit_copy.cpp
// compile with: /EHsc /W3
#include <memory>
#include <iostream>

using namespace std;

   class Integer 
   {
   public:
      Integer( int x ) : val( x ) {}
      int get( ) { return val; }
   private:
      int val;
   };

int main( )
{
   int Array[] = { 10, 20, 30, 40 };
   const int N = sizeof( Array ) / sizeof( int );

   int i;
   cout << "The initialized Array contains " << N << " elements: ";
      for (i = 0 ; i < N; i++ )
      {
         cout << " " << Array [ i ];
      }
   cout << endl;

   Integer* ArrayPtr = ( Integer* ) malloc( N * sizeof( int ) );
   Integer* LArrayPtr = uninitialized_copy(
      Array, Array + N, ArrayPtr);  // C4996

   cout << "Address of position after the last element in the array is: " 
        << &Array[0] + N << endl;
   cout << "The iterator returned by uninitialized_copy addresses: " 
        << ( void* )LArrayPtr << endl;
   cout << "The address just beyond the last copied element is: " 
        << ( void* )( ArrayPtr + N ) << endl;

   if ( ( &Array[0] + N ) == ( void* )LArrayPtr )
      cout << "The return value is an iterator "
           << "pointing just beyond the original array." << endl;
   else
      cout << "The return value is an iterator "
           << "not pointing just beyond the original array." << endl;

   if ( ( void* )LArrayPtr == ( void* )( ArrayPtr + N ) )
      cout << "The return value is an iterator "
           << "pointing just beyond the copied array." << endl;
   else
      cout << "The return value is an iterator "
           << "not pointing just beyond the copied array." << endl;

   free ( ArrayPtr );

   cout << "Note that the exact addresses returned will vary\n"
        << "with the memory allocation in individual computers."
        << endl;
}

Sortie de l'exemple

The initialized Array contains 4 elements: 10 20 30 40
Address of position after the last element in the array is: 0012FED8
The iterator returned by uninitialized_copy addresses: 00311B88
The address just beyond the last copied element is: 00311B88
The return value is an iterator not pointing just beyond the original array.
The return value is an iterator pointing just beyond the copied array.
Note that the exact addresses returned will vary
with  the memory allocation in individual computers.

Configuration requise

en-tête : <memory>

l'espace de noms : DST