Condividi tramite


uninitialized_copy

Oggetti di copie da un intervallo di origine specificato in un intervallo di destinazione non inizializzate.

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

Parametri

  • _First
    Un iteratore di input destinato al primo elemento nell'intervallo di origine.

  • _Last
    Un iteratore di input destinato all'ultimo elemento nell'intervallo di origine.

  • _Dest
    Un iteratore avanti destinato al primo elemento nell'intervallo di destinazione.

Valore restituito

Un iteratore avanti per la prima posizione oltre la durata di destinazione, a meno che nell'intervallo di origine sia _Firstiteratori e spazi degli indirizzi .

Note

Questo algoritmo consente la separazione di allocazione della memoria dalla costruzione di un oggetto.

La funzione di modello esegue effettivamente:

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

a meno che il codice genera un'eccezione.In tal caso, tutti gli oggetti costruiti vengono eliminate e l'eccezione viene generata.

uninitialized_copy dispone di due form correlati:

checked_uninitialized_copy

unchecked_uninitialized_copy

Per ulteriori informazioni su queste funzioni si comportano, vedere Iteratori verificati.

Esempio

// 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;
}

Output di esempio

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.

Requisiti

intestazione: <memory>

Spazio dei nomi: deviazione standard