uninitialized_copy
Объекты копий из указанного диапазона источника в неинициализированном диапазон назначения.
template<class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_copy(
InputIterator _First,
InputIterator _Last,
ForwardIterator _Dest
);
Параметры
_First
Итератор ввода адресацию первого элемента в диапазоне источника._Last
Итератор ввода адресацию последний элемент в диапазоне источника._Dest
Передний итератор адресацию первого элемента в диапазоне назначения.
Возвращаемое значение
Передний итератор адресацию первое положение после конца диапазона назначения, если диапазон источника не будет пустых и итератора адресов _First.
Заметки
Этот алгоритм позволяет разделения выделения памяти от конструкции объекта.
Функция фактически выполняет шаблон:
while ( _First!= _Last )
new ( ( void * )&*_Dest ++)
iterator_traits<InputIterator>::value_type ( *_First ++ );
return _First;
если код не будет создавать исключение.В этом случае все созданные объекты уничтожаются и исключение вызывается заново.
uninitialized_copy имеет значение 2, связанных форм:
Дополнительные сведения о том, как эти функции ведут себя см. в разделе Проверяемые итераторы.
Пример
// 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;
}
Вывод примера
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.
Требования
заголовок: <memory>
std пространство имен: