Compartir vía


raw_storage_iterator (Clase)

Una clase de adaptador que se proporciona para permitir que los algoritmos almacenen sus resultados en memoria sin inicializar.

Sintaxis

template <class OutputIterator, class Type>
    class raw_storage_iterator

Parámetros

OutputIterator
Especifica el iterador de salida para el objeto que se almacena.

Tipo
Tipo de objeto al que se va a asignar almacenamiento.

Comentarios

La clase describe un iterador de salida que construye objetos de tipo Type en la secuencia que genera. Un objeto de clase raw_storage_iterator<ForwardIterator, Type> accede al almacenamiento mediante un objeto de iterador hacia delante de clase ForwardIterator que se especifica al construir el objeto. Para un objeto primero de la clase ForwardIterator, la expresión &*first debe designar almacenamiento no construido para el siguiente objeto (de tipo Type) en la secuencia generada.

Esta clase de adaptador se usa cuando es necesario separar la asignación de memoria y la construcción de objetos. raw_storage_iterator puede usarse para copiar objetos en el almacenamiento no inicializado, como la memoria asignada mediante la función malloc.

Miembros

Constructores

Nombre Descripción
raw_storage_iterator Crea un iterador de almacenamiento sin formato con un iterador de salida subyacente especificado.

Typedefs

Nombre Descripción
element_type Proporciona un tipo que describe un elemento para almacenar un iterador de almacenamiento sin formato.
iter_type Proporciona un tipo que describe un iterador que subyace a un iterador de almacenamiento sin formato.

Operadores

Nombre Descripción
operator* Un operador de desreferencia usado para implementar la expresión del iterador de salida * ii = x.
operator= Un operador de asignación usado para implementar la expresión del iterador de almacenamiento sin formato * i = x para almacenar en memoria.
operator++ Operadores de preincremento y prostincremento para los iteradores de almacenamiento sin formato.

element_type

Proporciona un tipo que describe un elemento para almacenar un iterador de almacenamiento sin formato.

typedef Type element_type;

Comentarios

El tipo es un sinónimo del parámetro de plantilla de clase raw_storage_iterator Type.

iter_type

Proporciona un tipo que describe un iterador que subyace a un iterador de almacenamiento sin formato.

typedef ForwardIterator iter_type;

Comentarios

El tipo es un sinónimo del parámetro de plantilla ForwardIterator.

operator*

Operador de desreferenciación usado para implementar la expresión de iterador de almacenamiento sin formato * ii = x.

raw_storage_iterator<ForwardIterator, Type>& operator*();

Valor devuelto

Una referencia al iterador de almacenamiento sin formato

Comentarios

Los requisitos de ForwardIterator que el iterador de almacenamiento sin formato debe satisfacer solo requieren que la expresión * ii = t sea válida y que no indique nada sobre operator u operator= por su cuenta. Los operadores miembro de esta implementación devuelven *this, para que operator=(constType&) pueda realizar el almacén real en una expresión, como * ptr = val.

Ejemplo

// 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=

Operador de asignación usado para implementar la expresión del iterador de almacenamiento sin formato * i = x para almacenar en memoria.

raw_storage_iterator<ForwardIterator, Type>& operator=(
    const Type& val);

Parámetros

val
Valor del objeto de tipo Type que se va a insertar en la memoria.

Valor devuelto

El operador inserta val en la memoria y, después, devuelve una referencia al iterador de almacenamiento sin formato.

Comentarios

Los requisitos de un estado ForwardIterator que el iterador de almacenamiento sin formato debe satisfacer solo requieren que la expresión * ii = t sea válida y que no indique nada sobre operator u operator= por su cuenta. Estos operadores miembro devuelven *this.

El operador de asignación construye el siguiente objeto de la secuencia de salida con el valor del iterador almacenado first, mediante la evaluación de la expresión new de colocación new ( (void*) & *first ) Type( val ).

Ejemplo

// 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++

Operadores de preincremento y prostincremento para los iteradores de almacenamiento sin formato.

raw_storage_iterator<ForwardIterator, Type>& operator++();

raw_storage_iterator<ForwardIterator, Type> operator++(int);

Valor devuelto

Un iterador de almacenamiento sin formato o una referencia a uno.

Comentarios

El primer operador al final intenta extraer y almacenar un objeto de tipo CharType del flujo de entrada asociado. El segundo operador realiza una copia del objeto, lo incrementa y, después, devuelve la copia.

El primer operador preincremento incrementa el objeto de iterador de salida almacenado y luego devuelve *this.

El segundo operador postincremento realiza una copia de *this, incrementa el objeto de iterador de salida almacenado y luego devuelve la copia.

El constructor almacena first como objeto de iterador de salida.

Ejemplo

// 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

Crea un iterador de almacenamiento sin formato con un iterador de salida subyacente especificado.

explicit raw_storage_iterator(ForwardIterator first);

Parámetros

first
El iterador de reenvío que va a subyacer al objeto raw_storage_iterator que se está construyendo.

Ejemplo

// 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