uninitialized_copy
Kopiuje obiekty z określonego zakresu źródłowego do niezainicjowanego zakresu docelowego.
template<class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_copy(
InputIterator _First,
InputIterator _Last,
ForwardIterator _Dest
);
Parametry
_First
Iterator danych wejściowych, odnoszący się do pierwszego elementu w zakresie źródłowym._Last
Iterator danych wejściowych, odnoszący się do ostatniego elementu w zakresie źródłowym._Dest
Iterator do przodu, który dotyczy pierwszego elementu w zakresie docelowym.
Wartość zwracana
Iterator do przodu, odnoszący się do pierwszej pozycji poza zakresem docelowym, chyba że zakres źródłowy był pusty, a iterator odnosi się do _First.
Uwagi
Ten algorytm umożliwia oddzielenie alokacji pamięci od konstrukcji obiektu.
Funkcja szablonu skutecznie wykonuje:
while ( _First!= _Last )
new ( ( void * )&*_Dest ++)
iterator_traits<InputIterator>::value_type ( *_First ++ );
return _First;
chyba że kod zgłasza wyjątek.W takim przypadku wszystkie skonstruowane obiekty są niszczone, a wyjątek jest zgłaszany ponownie.
Przykład
// 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;
}
Przykładowe dane wyjściowe
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.
Wymagania
Nagłówek: <memory>
Przestrzeń nazw: std