raw_storage_iterator — Klasa
Klasa adaptera, która jest dostarczana, aby umożliwić algorytmom zapisywanie ich wyników do pamięci niezainicjowanej.
Składnia
template <class OutputIterator, class Type>
class raw_storage_iterator
Parametry
OutputIterator
Określa iterator danych wyjściowych dla przechowywanego obiektu.
Type
Typ obiektu, dla którego jest przydzielany magazyn.
Uwagi
Klasa opisuje iterator danych wyjściowych, który konstruuje obiekty typu Type
w sekwencji, którą generuje. Obiekt klasy raw_storage_iterator
<ForwardIterator, Type> uzyskuje dostęp do magazynu za pośrednictwem obiektu iteratora do przodu klasy ForwardIterator
, który określa się podczas konstruowania obiektu. W przypadku obiektu pierwszego klasy ForwardIterator
wyrażenie &*najpierw musi wyznaczyć niezkonstrukowany magazyn dla następnego obiektu (typu Type
) w wygenerowanej sekwencji.
Ta klasa adaptera jest używana, gdy jest konieczne oddzielenie alokacji pamięci i konstrukcji obiektu. Obiekt raw_storage_iterator
może służyć do kopiowania obiektów do niezainicjowanego magazynu, takiego jak pamięć przydzielona malloc
przy użyciu funkcji .
Elementy członkowskie
Konstruktory
Nazwa/nazwisko | opis |
---|---|
raw_storage_iterator | Tworzy iterator magazynu pierwotnego z określonym iteratorem wyjściowym. |
Typedefs
Nazwa/nazwisko | opis |
---|---|
element_type | Zawiera typ opisujący element do przechowywania iteratora magazynu pierwotnego. |
iter_type | Zawiera typ opisujący iterator, który stanowi podstawy nieprzetworzonego iteratora magazynu. |
Operatory
Nazwa/nazwisko | opis |
---|---|
operator* | Operator wyłudania używany do implementowania wyrażenia iteratora wyjściowego * ii = x . |
operator = | Operator przypisania używany do implementowania nieprzetworzonego wyrażenia iteratora magazynu * i = x do przechowywania w pamięci. |
operator++ | Operatory preinkrementacji i postinkrementacji dla iteratorów magazynu pierwotnego. |
element_type
Zawiera typ opisujący element do przechowywania iteratora magazynu pierwotnego.
typedef Type element_type;
Uwagi
Typ jest synonimem parametru Type
szablonu klasy raw_storage_iterator .
iter_type
Zawiera typ opisujący iterator, który stanowi podstawy nieprzetworzonego iteratora magazynu.
typedef ForwardIterator iter_type;
Uwagi
Typ jest synonimem parametru ForwardIterator
szablonu .
operator*
Operator wyłudania używany do implementowania nieprzetworzonego wyrażenia iteratora magazynu * ii = x.
raw_storage_iterator<ForwardIterator, Type>& operator*();
Wartość zwracana
Odwołanie do iteratora magazynu pierwotnego
Uwagi
Wymagania dotyczące elementu ForwardIterator
są następujące, że iterator magazynu pierwotnego musi spełniać, wymagają tylko wyrażenia * ii = nieprawidłowe i że nie mówi nic o operator
lub operator=
na własną rękę. Operatory składowe w tej implementacji zwracają wartość , aby operator=(constType&) mógł wykonać rzeczywisty magazyn w wyrażeniu, takim jak * ptr = val
.*this
Przykład
// 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 =
Operator przypisania używany do implementowania nieprzetworzonego wyrażenia iteratora magazynu * i = x do przechowywania w pamięci.
raw_storage_iterator<ForwardIterator, Type>& operator=(
const Type& val);
Parametry
Val
Wartość obiektu typu Type
, który ma zostać wstawiony do pamięci.
Wartość zwracana
Operator wstawia val
do pamięci, a następnie zwraca odwołanie do iteratora magazynu pierwotnego.
Uwagi
Wymagania dotyczące ForwardIterator
stanu, który musi spełniać iterator magazynu pierwotnego, wymagają tylko wyrażenia * ii = nie są prawidłowe i że nie mówi nic o operator
lub operator=
na własną rękę. Te operatory składowe zwracają wartość *this
.
Operator przypisania konstruuje następny obiekt w sekwencji wyjściowej przy użyciu przechowywanej wartości first
iteratora , oceniając nowe wyrażenie new ( (void*) & *first ) Type( val )
umieszczania .
Przykład
// 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++
Operatory preinkrementacji i postinkrementacji dla iteratorów magazynu pierwotnego.
raw_storage_iterator<ForwardIterator, Type>& operator++();
raw_storage_iterator<ForwardIterator, Type> operator++(int);
Wartość zwracana
Iterator magazynu pierwotnego lub odwołanie do iteratora magazynu pierwotnego.
Uwagi
Pierwszy operator ostatecznie próbuje wyodrębnić i zapisać obiekt typu CharType
ze skojarzonego strumienia wejściowego. Drugi operator tworzy kopię obiektu, zwiększa obiekt, a następnie zwraca kopię.
Pierwszy operator preinkrementacji zwiększa przechowywany obiekt iteratora wyjściowego, a następnie zwraca wartość *this
.
Drugi operator postincrement tworzy kopię *this
elementu , zwiększa przechowywany obiekt iteratora danych wyjściowych, a następnie zwraca kopię.
Konstruktor przechowuje first
jako obiekt iteratora wyjściowego.
Przykład
// 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
Tworzy iterator magazynu pierwotnego z określonym iteratorem wyjściowym.
explicit raw_storage_iterator(ForwardIterator first);
Parametry
pierwszy
Iterator przesyłania dalej, który ma ujmować raw_storage_iterator
obiekt, który jest konstruowany.
Przykład
// 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