Поделиться через


Класс raw_storage_iterator

Класс-адаптер, который предоставляется, чтобы алгоритмы могли сохранять свои результаты в неинициализированной памяти.

Синтаксис

template <class OutputIterator, class Type>
    class raw_storage_iterator

Параметры

OutputIterator
Указывает выходной итератор сохраняемого объекта.

Тип
Тип объекта, для которого выполняется выделение памяти.

Замечания

Класс описывает выходной итератор, который создает объекты типа Type в создаваемой последовательности. Объект класса raw_storage_iterator<ForwardIterator, Тип> обращается к хранилищу через объект итератора пересылки, который ForwardIteratorуказывается при создании объекта. Для объекта первого класса ForwardIteratorвыражение &*сначала должно назначить неконструкционное хранилище для следующего объекта (типа Type) в созданной последовательности.

Этот класс адаптера используется, если необходимо разделить выделение памяти и строительство объектов. raw_storage_iterator можно использовать для копирования объектов в неинициализированное хранилище, например в память, выделенную с помощью функции malloc.

Участники

Конструкторы

Имя Описание
raw_storage_iterator Создает итератор необработанного хранилища с указанным базовым выходным итератором.

Определения типов

Имя Описание
element_type Предоставляет тип, описывающий элемент, в котором будет сохранен итератор необработанного хранилища.
iter_type Предоставляет тип, который описывает итератор, базовый для итератора необработанного хранилища.

Операторы

Имя Описание
operator* Оператор разыменования, используемый для реализации выражения итератора вывода * ii = x.
operator= Оператор присваивания, используемый для реализации выражения итератора необработанного хранилища * i = x для сохранения в памяти.
оператор++ Преинкрементный и постинкрементный операторы для итераторов необработанного хранилища.

element_type

Предоставляет тип, описывающий элемент, в котором будет сохранен итератор необработанного хранилища.

typedef Type element_type;

Замечания

Тип является синонимом для параметра Typeшаблона класса raw_storage_iterator.

iter_type

Предоставляет тип, который описывает итератор, базовый для итератора необработанного хранилища.

typedef ForwardIterator iter_type;

Замечания

Этот тип является синонимом для параметра шаблона ForwardIterator.

operator*

Оператор расшифровки, используемый для реализации выражения итератора необработанного хранилища * ii = x.

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

Возвращаемое значение

Ссылка на итератор необработанного хранилища

Замечания

Требования к ForwardIterator итератору необработанного хранилища должны соответствовать, требуется только выражение * ii = не допустимо, и что он ничего не говорит о operator или operator= о собственном. Операторы-члены в этой реализации возвращаются, поэтому оператор=(constType&) может выполнять фактическое хранилище в выражении, например * ptr = val.*this

Пример

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

Оператор назначения, используемый для реализации выражения итератора необработанного хранилища * i = x для хранения в памяти.

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

Параметры

Val
Значение объекта типа Type , который необходимо вставить в память.

Возвращаемое значение

Оператор вставляет val в память и возвращает ссылку на итератор необработанного хранилища.

Замечания

Требования к состояниюForwardIterator, которое должен соответствовать итератору необработанного хранилища, требуют только выражение * ii = t допустимым, и что он ничего не говорит о operator или operator= о своих собственных. Эти операторы-члены возвращаются *this.

Оператор присваивания создает следующий объект в выходной последовательности с помощью сохраненного значения firstитератора, оценивая новое выражение new ( (void*) & *first ) Type( val )размещения.

Пример

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

оператор++

Преинкрементный и постинкрементный операторы для итераторов необработанного хранилища.

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

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

Возвращаемое значение

Итератор необработанного хранилища или ссылка на итератор необработанного хранилища.

Замечания

Первый оператор в конечном итоге пытается извлечь и сохранить объект типа CharType из связанного входного потока. Второй оператор создает копию объекта, выполняет приращение объекта, а затем возвращает копию.

Первый оператор предварительного увеличения увеличивает сохраненный объект итератора выходных данных, а затем возвращает *this.

Второй оператор postincrement делает копию *this, увеличивает сохраненный объект итератора выходных данных, а затем возвращает копию.

Конструктор сохраняет first в качестве выходного итератора объект.

Пример

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

Создает итератор необработанного хранилища с указанным базовым выходным итератором.

explicit raw_storage_iterator(ForwardIterator first);

Параметры

first
Прямой итератор, который лежит в основе создаваемого объекта raw_storage_iterator.

Пример

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