Sdílet prostřednictvím


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 ForwardIteratormusí 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 firstvyhodnocení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