Classe raw_storage_iterator
Classe dell'adattatore fornita per consentire agli algoritmi di archiviare i rispettivi risultati nella memoria non inizializzata.
Sintassi
template <class OutputIterator, class Type>
class raw_storage_iterator
Parametri
OutputIterator
Specifica l'iteratore di output per l'oggetto archiviato.
Type
Tipo di oggetto per cui viene allocata archiviazione.
Osservazioni:
La classe descrive un iteratore di output che costruisce oggetti di tipo Type
nella sequenza generata. Oggetto della classe raw_storage_iterator
<ForwardIterator, Type> accede all'archiviazione tramite un oggetto iteratore in avanti, della classe ForwardIterator
, specificato quando si costruisce l'oggetto . Per un oggetto prima di classe ForwardIterator
, l'espressione &*deve innanzitutto designare l'archiviazione non construita per l'oggetto successivo (di tipo Type
) nella sequenza generata.
Questa classe adattatore viene usata quando è necessario separare l'allocazione della memoria e la costruzione di oggetti. L'oggetto raw_storage_iterator
può essere usato per copiare oggetti nell'archiviazione non inizializzata, ad esempio la memoria allocata usando la funzione malloc
.
Membri
Costruttori
Nome | Descrizione |
---|---|
raw_storage_iterator | Costruisce un iteratore di archiviazione non elaborato con un iteratore di output sottostante specificato. |
Typedef
Nome | Descrizione |
---|---|
element_type | Fornisce un tipo che descrive un elemento da archiviare in un iteratore di archiviazione non elaborato. |
iter_type | Fornisce un tipo che descrive un iteratore sottostante a un iteratore di archiviazione non elaborato. |
Operatori
Nome | Descrizione |
---|---|
operator* | Operatore di dereferenziazione usato per implementare l'espressione dell'iteratore di output * ii = x . |
operator= | Operatore di assegnazione usato per implementare l'espressione dell'iteratore di archiviazione non elaborato * i = x per l'archiviazione in memoria. |
operator++ | Operatori di incremento prefisso e incremento suffisso per iteratori di archiviazione non elaborati. |
element_type
Fornisce un tipo che descrive un elemento da archiviare in un iteratore di archiviazione non elaborato.
typedef Type element_type;
Osservazioni:
Il tipo è un sinonimo del parametro Type
del modello di classe raw_storage_iterator .
iter_type
Fornisce un tipo che descrive un iteratore sottostante a un iteratore di archiviazione non elaborato.
typedef ForwardIterator iter_type;
Osservazioni:
Il tipo è un sinonimo del parametro di modello ForwardIterator
.
operator*
Operatore di dereferenziazione usato per implementare l'espressione iteratore di archiviazione non elaborata * ii = x.
raw_storage_iterator<ForwardIterator, Type>& operator*();
Valore restituito
Riferimento all'iteratore di archiviazione non elaborato
Osservazioni:
I requisiti per un ForwardIterator
sono che l'iteratore di archiviazione non elaborato deve soddisfare, richiedere solo l'espressione * ii = t essere valida e che non dice nulla su operator
o su operator=
di essi. Gli operatori membro in questa implementazione, restituisce *this
, in modo che operator=(constType&) possa eseguire l'archivio effettivo in un'espressione, ad esempio * ptr = val
.
Esempio
// raw_storage_iterator_op_deref.cpp
// compile with: /EHsc
#include <iostream>
#include <iterator>
#include <memory>
#include <list>
using namespace std;
class Int
{
public:
Int(int i)
{
cout << "Constructing " << i << endl;
x = i;
bIsConstructed = true;
};
Int &operator=(int i)
{
if (!bIsConstructed)
cout << "Not constructed.\n";
cout << "Copying " << i << endl;
x = i;
return *this;
};
int x;
private:
bool bIsConstructed;
};
int main( void)
{
Int *pInt = ( Int* ) malloc( sizeof( Int ) );
memset( pInt, 0, sizeof( Int ) ); // Set bIsConstructed to false;
*pInt = 5;
raw_storage_iterator< Int*, Int > it( pInt );
*it = 5;
}
Not constructed.
Copying 5
Constructing 5
operator=
Operatore di assegnazione usato per implementare l'espressione iteratore di archiviazione non elaborata * i = x per l'archiviazione in memoria.
raw_storage_iterator<ForwardIterator, Type>& operator=(
const Type& val);
Parametri
val
Valore dell'oggetto di tipo Type
da inserire in memoria.
Valore restituito
L'operatore inserisce val
in memoria, quindi restituisce un riferimento all'iteratore di archiviazione non elaborato.
Osservazioni:
I requisiti per uno ForwardIterator
stato che l'iteratore di archiviazione non elaborato deve soddisfare, richiedono solo l'espressione * ii = t essere valida e che non dice nulla su operator
o su operator=
di essi. Questi operatori membro restituiscono *this
.
L'operatore di assegnazione costruisce l'oggetto successivo nella sequenza di output usando il valore first
dell'iteratore archiviato , valutando la nuova espressione new ( (void*) & *first ) Type( val )
di posizionamento .
Esempio
// raw_storage_iterator_op_assign.cpp
// compile with: /EHsc
#include <iostream>
#include <iterator>
#include <memory>
#include <list>
using namespace std;
class Int
{
public:
Int( int i )
{
cout << "Constructing " << i << endl;
x = i;
bIsConstructed = true;
};
Int &operator=( int i )
{
if ( !bIsConstructed )
cout << "Not constructed.\n";
cout << "Copying " << i << endl; x = i;
return *this;
};
int x;
private:
bool bIsConstructed;
};
int main( void )
{
Int *pInt = ( Int* )malloc( sizeof( Int ) );
memset( pInt, 0, sizeof( Int ) ); // Set bIsConstructed to false;
*pInt = 5;
raw_storage_iterator<Int*, Int> it( pInt );
*it = 5;
}
Not constructed.
Copying 5
Constructing 5
operator++
Operatori di incremento prefisso e incremento suffisso per iteratori di archiviazione non elaborati.
raw_storage_iterator<ForwardIterator, Type>& operator++();
raw_storage_iterator<ForwardIterator, Type> operator++(int);
Valore restituito
Iteratore di archiviazione non elaborato o riferimento a un iteratore di archiviazione non elaborato.
Osservazioni:
Il primo operatore tenta infine di estrarre e archiviare un oggetto di tipo CharType
dal flusso di input associato. Il secondo operatore esegue una copia dell'oggetto, incrementa l'oggetto, quindi restituisce la copia.
Il primo operatore di preincrement incrementa l'oggetto iteratore di output archiviato e quindi restituisce *this
.
Il secondo operatore di postincrement crea una copia di *this
, incrementa l'oggetto iteratore di output archiviato e quindi restituisce la copia.
Il costruttore archivia first
come oggetto iteratore di output.
Esempio
// raw_storage_iterator_op_incr.cpp
// compile with: /EHsc
#include <iostream>
#include <iterator>
#include <memory>
#include <list>
using namespace std;
int main( void )
{
int *pInt = new int[5];
std::raw_storage_iterator<int*,int> it( pInt );
for ( int i = 0; i < 5; i++, it++ ) {
*it = 2 * i;
};
for ( int i = 0; i < 5; i++ ) cout << "array " << i << " = " << pInt[i] << endl;;
delete[] pInt;
}
array 0 = 0
array 1 = 2
array 2 = 4
array 3 = 6
array 4 = 8
raw_storage_iterator
Costruisce un iteratore di archiviazione non elaborato con un iteratore di output sottostante specificato.
explicit raw_storage_iterator(ForwardIterator first);
Parametri
first
L'iteratore in avanti sottostante all'oggetto raw_storage_iterator
costruito.
Esempio
// raw_storage_iterator_ctor.cpp
// compile with: /EHsc /W3
#include <iostream>
#include <iterator>
#include <memory>
#include <list>
using namespace std;
class Int
{
public:
Int(int i)
{
cout << "Constructing " << i << endl;
x = i;
bIsConstructed = true;
};
Int &operator=( int i )
{
if (!bIsConstructed)
cout << "Error! I'm not constructed!\n";
cout << "Copying " << i << endl; x = i; return *this;
};
int x;
bool bIsConstructed;
};
int main( void )
{
std::list<int> l;
l.push_back( 1 );
l.push_back( 2 );
l.push_back( 3 );
l.push_back( 4 );
Int *pInt = (Int*)malloc(sizeof(Int)*l.size( ));
memset (pInt, 0, sizeof(Int)*l.size( ));
// Hack: make sure bIsConstructed is false
std::copy( l.begin( ), l.end( ), pInt ); // C4996
for (unsigned int i = 0; i < l.size( ); i++)
cout << "array " << i << " = " << pInt[i].x << endl;;
memset (pInt, 0, sizeof(Int)*l.size( ));
// hack: make sure bIsConstructed is false
std::copy( l.begin( ), l.end( ),
std::raw_storage_iterator<Int*,Int>(pInt)); // C4996
for (unsigned int i = 0; i < l.size( ); i++ )
cout << "array " << i << " = " << pInt[i].x << endl;
free(pInt);
}
Error! I'm not constructed!
Copying 1
Error! I'm not constructed!
Copying 2
Error! I'm not constructed!
Copying 3
Error! I'm not constructed!
Copying 4
array 0 = 1
array 1 = 2
array 2 = 3
array 3 = 4
Constructing 1
Constructing 2
Constructing 3
Constructing 4
array 0 = 1
array 1 = 2
array 2 = 3
array 3 = 4