uninitialized_copy
Copie les objets d'une plage source spécifiée dans une plage de destination non initialisée.
template<class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_copy(
InputIterator _First,
InputIterator _Last,
ForwardIterator _Dest
);
Paramètres
_First
Itérateur d'entrée qui traite le premier élément d'une plage source._Last
Itérateur d'entrée qui traite le dernier élément d'une plage source._Dest
Itérateur forward qui traite le premier élément d'une plage de destination.
Valeur de retour
Itérateur forward qui traite la première position au-delà de la plage de destination, sauf si la plage source est vide ou si l'itérateur traite _First.
Notes
Cet algorithme permet de découpler l'allocation de mémoire et la construction d'objet.
La fonction de modèle est exécutée :
while ( _First!= _Last )
new ( ( void * )&*_Dest ++)
iterator_traits<InputIterator>::value_type ( *_First ++ );
return _First;
à moins que le code ne provoque la levée d'une exception. Dans ce cas, tous les objets construits sont détruits et l'exception est de nouveau levée.
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;
}
Exemple de sortie
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>
Espace de noms : std