Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 ForwardIteratorwyraż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 Typeszablonu 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 ForwardIteratorszablonu .
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 firstiteratora , 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ę *thiselementu , 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