raw_storage_iterator – třída
Třída adaptéru, která je k dispozici pro povolení algoritmů pro ukládání výsledků do neinicializované paměti.
Syntaxe
template <class OutputIterator, class Type>
class raw_storage_iterator
Parametry
OutputIterator
Určuje výstupní iterátor pro objekt, který se ukládá.
Typ
Typ objektu, pro který se přiděluje úložiště.
Poznámky
Třída popisuje výstupní iterátor, který vytváří objekty typu Type
v posloupnosti, kterou generuje. Objekt třídy raw_storage_iterator
<ForwardIterator, Type> přistupuje k úložišti prostřednictvím forward iterator objektu třídy ForwardIterator
, který určíte při vytváření objektu. U objektu první třídy ForwardIterator
musí výraz &*first určit nekonstruované úložiště pro další objekt (typu Type
) ve vygenerované sekvenci.
Tato třída adaptéru se používá, když je nutné oddělit přidělení paměti a konstrukci objektů. Lze raw_storage_iterator
použít ke kopírování objektů do neinicializovaného úložiště, jako je například paměť přidělená pomocí malloc
funkce.
Členové
Konstruktory
Název | Popis |
---|---|
raw_storage_iterator | Vytvoří iterátor nezpracovaného úložiště se zadaným podkladovým iterátorem výstupu. |
Typedefs
Název | Popis |
---|---|
element_type | Poskytuje typ, který popisuje prvek, který má být uložen nezpracovaný iterátor úložiště. |
iter_type | Poskytuje typ, který popisuje iterátor, který je základem nezpracovaného iterátoru úložiště. |
Operátory
Název | Popis |
---|---|
operátor* | Operátor dereferencingu použitý k implementaci výrazu iterátoru výstupu * ii = x . |
operator= | Operátor přiřazení použitý k implementaci výrazu iterátoru nezpracovaného úložiště * i = x pro ukládání do paměti. |
operator++ | Operátory preinkrementace a postinkrementace pro iterátory nezpracovaných úložišť |
element_type
Poskytuje typ, který popisuje prvek, který má být uložen nezpracovaný iterátor úložiště.
typedef Type element_type;
Poznámky
Typ je synonymem pro parametr Type
šablony třídy raw_storage_iterator .
iter_type
Poskytuje typ, který popisuje iterátor, který je základem nezpracovaného iterátoru úložiště.
typedef ForwardIterator iter_type;
Poznámky
Typ je synonymem pro parametr ForwardIterator
šablony .
operátor*
Operátor dereferencingu použitý k implementaci výrazu iterátoru nezpracovaného úložiště * ii = x.
raw_storage_iterator<ForwardIterator, Type>& operator*();
Návratová hodnota
Odkaz na iterátor nezpracovaného úložiště
Poznámky
Požadavky na ForwardIterator
splnění nezpracovaného iterátoru úložiště musí být splněny, vyžadují pouze výraz * ii = t být platný a že o sobě nic nehlásí operator
operator=
. Členské operátory v této implementaci vrátí *this
, takže operator=(constType&) může provést skutečné úložiště ve výrazu, například * ptr = val
.
Příklad
// 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=
Operátor přiřazení použitý k implementaci nezpracovaného výrazu iterátoru úložiště * i = x pro ukládání do paměti.
raw_storage_iterator<ForwardIterator, Type>& operator=(
const Type& val);
Parametry
Val
Hodnota objektu typu Type
, který se má vložit do paměti.
Návratová hodnota
Operátor vloží val
do paměti a pak vrátí odkaz na nezpracovaný iterátor úložiště.
Poznámky
Požadavky na stav, že iterátor nezpracovaného ForwardIterator
úložiště musí splňovat, vyžaduje pouze výraz * ii = t být platný a že o operator
operator=
něm nic nehlásí. Tyto členské operátory vrátí *this
.
Operátor přiřazení vytvoří další objekt ve výstupní sekvenci pomocí hodnoty uloženého iterátoru first
vyhodnocením nového výrazu new ( (void*) & *first ) Type( val )
umístění .
Příklad
// 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++
Operátory preinkrementace a postinkrementace pro iterátory nezpracovaných úložišť
raw_storage_iterator<ForwardIterator, Type>& operator++();
raw_storage_iterator<ForwardIterator, Type> operator++(int);
Návratová hodnota
Iterátor nezpracovaného úložiště nebo odkaz na iterátor nezpracovaného úložiště
Poznámky
První operátor se nakonec pokusí extrahovat a uložit objekt typu CharType
z přidruženého vstupního datového proudu. Druhý operátor vytvoří kopii objektu, zvýší objekt a vrátí kopii.
První operátor předinkrementace zvýší uložený výstupní iterátor objektu a pak vrátí *this
.
Druhý operátor postinkrementace vytvoří kopii *this
, zvýší uložený výstupní iterátor objektu a pak vrátí kopii.
Konstruktor ukládá first
jako výstupní objekt iterátoru.
Příklad
// 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
Vytvoří iterátor nezpracovaného úložiště se zadaným podkladovým iterátorem výstupu.
explicit raw_storage_iterator(ForwardIterator first);
Parametry
první
Předaný iterátor, který je základem objektu raw_storage_iterator
, který je vytvořen.
Příklad
// 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