raw_storage_iterator 类

一种所提供的适配器类,使算法能够将它们的结果存储到未初始化的内存中。

语法

template <class OutputIterator, class Type>
    class raw_storage_iterator

参数

OutputIterator
为正被存储的对象指定输出迭代器。

类型
正为其分配存储的对象的类型。

备注

此类描述一个输出迭代器,该迭代器在它生成的序列中构造 Type 类型的对象。 类 raw_storage_iterator<ForwardIterator, Type> 的对象通过构造该对象时指定的 ForwardIterator 类的向前迭代器对象来访问存储。 对于类 ForwardIterator 的第一个对象,表达式 &*first 必须为生成序列中的下一个对象(类型为 Type)指定未构造的存储。

在需要分隔内存分配和对象构造时使用此适配器类。 raw_storage_iterator 可用于将对象复制到未初始化的存储中,如使用 malloc 函数分配的内存。

成员

构造函数

名称 描述
raw_storage_iterator 使用指定的基础输出迭代器构造原始存储迭代器。

Typedef

名称 描述
element_type 提供一种类型,该类型描述要存储在原始存储迭代器中的元素。
iter_type 提供了一种类型,该类型描述原始存储迭代器所基于的迭代器。

运算符

名称 描述
operator* 用于实现输出迭代器表达式 * ii = x 的取消引用运算符。
operator= 用于实现原始存储迭代器表达式 * i = x 以便在内存中进行存储的赋值运算符。
operator++ 原始存储迭代器的前置递增和后置递增运算符。

element_type

提供一种类型,该类型描述要存储在原始存储迭代器中的元素。

typedef Type element_type;

备注

该类型是 raw_storage_iterator 类模板参数 Type 的同义词。

iter_type

提供了一种类型,该类型描述原始存储迭代器所基于的迭代器。

typedef ForwardIterator iter_type;

备注

该类型是模板参数 ForwardIterator 的同义词。

operator*

用于实现原始存储迭代器表达式 * ii = x。

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

返回值

对原始存储迭代器的引用

备注

ForwardIterator 的要求是原始存储迭代器必须满足仅要求表达式 * ii = t 有效,且其本身不提及 operatoroperator= 此实现中的成员运算符返回 *this,以便 operator=(constType&) 可在表达式中执行实际存储,如 * ptr = val

示例

// 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 有效,且其本身不提及 operatoroperator= 这些成员运算符返回 *this

赋值运算符通过计算放置 new 表达式 new ( (void*) & *first ) Type( val ),首先使用存储的迭代器值 first 在输出序列中构造下一个对象。

示例

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

原始存储迭代器的前置递增和后置递增运算符。

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

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

返回值

原始存储迭代器或对原始存储迭代器的引用。

注解

第一个运算符最终尝试从关联的输入流提取和存储 CharType 类型的对象。 第二个运算符生成对象的副本,递增对象,然后返回副本。

第一个前置递增运算符递增存储的输出迭代器对象,然后返回 *this

第二个后置递增运算符生成 *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