共用方式為


raw_storage_iterator 類別

提供的配接器類別,可讓演算法將其結果儲存至未初始化的記憶體。

語法

template <class OutputIterator, class Type>
    class raw_storage_iterator

參數

OutputIterator
指定要儲存之物件的輸出迭代器。

類型
正在配置儲存體的物件類型。

備註

類別描述輸出反覆運算器,此反覆運算器會建構其產生的序列中型別 Type 的物件。 ForwardIterator 類別<raw_storage_iterator的物件 Type> 會透過 類別ForwardIterator的正向反覆運算器物件存取記憶體,而您在建構 物件時指定該物件。 針對 類別 ForwardIterator的第一個物件,expression &*first 必須在產生的序列中,為下一個物件指定 Type未建構的儲存區。

當需要分隔記憶體配置和物件建構時,會使用這個配接器類別。 raw_storage_iterator 可以用來將物件複製到未初始化的儲存體,例如使用malloc 函式配置的記憶體。

成員

建構函式

名稱 描述
raw_storage_iterator 藉由指定的基礎輸出迭代器建構原始儲存體迭代器。

Typedefs

名稱 描述
element_type 提供一個類型,其描述要儲存在原始儲存體的項目。
iter_type 提供一個類型,其描述為原始儲存體迭代器基礎的迭代器。

操作員

名稱 描述
operator* 取值運算子,用來實作輸出迭代器運算式 * ii = x
operator= 指派運算子,用來實作原始儲存體迭代器運算式 * i = x 以儲存於記憶體中。
operator++ 原始儲存體迭代器的前置遞增和後置遞增運算子。

element_type

提供一個類型,其描述要儲存在原始儲存體的項目。

typedef Type element_type;

備註

此類型與類別範本參數 Typeraw_storage_iterator 同義。

iter_type

提供一個類型,其描述為原始儲存體迭代器基礎的迭代器。

typedef ForwardIterator iter_type;

備註

此類型是範本參數 ForwardIterator的同義字。

operator*

用來實作原始記憶體反覆運算器表示式 * ii = x 的取值運算元。

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

傳回值

原始儲存體迭代器的參考

備註

的需求ForwardIterator是,原始記憶體反覆運算器必須滿足,只需要運算式 * ii = 無效,而且它不會自行對 或 operator= 說出任何內容。operator 這個實作中的成員運算符會傳 *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 = 無效,而且它不會自行對 或 operator= 說出任何內容。operator 這些成員運算子會傳回 *this

指派運算符會藉由評估位置新運算式 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