raw_storage_iterator, classe
Classe d'adaptateur fournie pour permettre aux algorithmes de stocker leurs résultats dans la mémoire non initialisée.
Syntaxe
template <class OutputIterator, class Type>
class raw_storage_iterator
Paramètres
OutputIterator
Spécifie l'itérateur de sortie de l'objet stocké.
Type
Type d'objet pour lequel le stockage est alloué.
Notes
La classe décrit un itérateur de sortie qui construit des objets de type Type
dans la séquence qu’elle génère. Objet de classe raw_storage_iterator
<ForwardIterator, Type> accède au stockage via un objet itérateur de transfert, de classe ForwardIterator
, que vous spécifiez lorsque vous construisez l’objet. Pour un objet premier de classe ForwardIterator
, l’expression &*first doit désigner un stockage nonconstructé pour l’objet suivant (de type Type
) dans la séquence générée.
Cette classe d’adaptateur est utilisée lorsqu’il est nécessaire de séparer l’allocation de mémoire et la construction d’objets. Le raw_storage_iterator
peut être utilisé pour copier des objets dans le stockage non initialisé, comme la mémoire allouée à l'aide de la fonction malloc
.
Membres
Constructeurs
Nom | Description |
---|---|
raw_storage_iterator | Construit un itérateur de stockage brut avec un itérateur de sortie sous-jacent spécifié. |
Typedefs
Nom | Description |
---|---|
element_type | Fournit un type qui décrit un élément à stocker dans un itérateur de stockage brut. |
iter_type | Fournit un type qui décrit un itérateur sous-jacent à un itérateur de stockage brut. |
Opérateurs
Nom | Description |
---|---|
operator* | Opérateur de suppression de référence utilisé pour implémenter l’expression d’itérateur de sortie * ii = x . |
operator= | Opérateur d’assignation utilisé pour implémenter l’expression d’itérateur de stockage brut * i = x pour le stockage en mémoire. |
operator++ | Opérateurs de préincrémentation et de postincrémentation pour les itérateurs de stockage brut. |
element_type
Fournit un type qui décrit un élément à stocker dans un itérateur de stockage brut.
typedef Type element_type;
Notes
Le type est un synonyme du paramètre Type
de modèle de classe raw_storage_iterator.
iter_type
Fournit un type qui décrit un itérateur sous-jacent à un itérateur de stockage brut.
typedef ForwardIterator iter_type;
Notes
Le type est un synonyme du paramètre de modèle ForwardIterator
.
operator*
Opérateur de déreferencing utilisé pour implémenter l’expression itérateur de stockage brute * ii = x.
raw_storage_iterator<ForwardIterator, Type>& operator*();
Valeur de retour
Référence à l’itérateur de stockage brut
Notes
Les exigences d’un ForwardIterator
sont que l’itérateur de stockage brut doit satisfaire, n’exige que l’expression * ii = ne soit pas valide et qu’elle ne dit rien sur le ou sur operator
operator=
leur propre. Les opérateurs membres de cette implémentation retournent *this
, afin que operator=(constType&) puisse effectuer le magasin réel dans une expression, par exemple * ptr = val
.
Exemple
// 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
opérateur =
Opérateur d’affectation utilisé pour implémenter l’expression d’itérateur de stockage brut * i = x pour le stockage en mémoire.
raw_storage_iterator<ForwardIterator, Type>& operator=(
const Type& val);
Paramètres
val
Valeur de l’objet de type Type
à insérer dans la mémoire.
Valeur de retour
L’opérateur stocke val
dans la mémoire, puis retourne une référence à l’itérateur de stockage brut.
Notes
Les exigences d’un ForwardIterator
état que l’itérateur de stockage brut doit satisfaire, ne nécessitent que l’expression * ii = n’est pas valide, et qu’elle ne dit rien sur le ou sur operator
operator=
leur propre. Ces opérateurs membres retournent *this
.
L’opérateur d’affectation construit l’objet suivant dans la séquence de sortie à l’aide de la valeur first
d’itérateur stockée, en évaluant la nouvelle expression new ( (void*) & *first ) Type( val )
de placement.
Exemple
// 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++
Opérateurs de préincrémentation et de postincrémentation pour les itérateurs de stockage brut.
raw_storage_iterator<ForwardIterator, Type>& operator++();
raw_storage_iterator<ForwardIterator, Type> operator++(int);
Valeur de retour
Itérateur de stockage brut ou référence à un itérateur de stockage brut.
Notes
Le premier opérateur tente finalement d’extraire et de stocker un objet de type CharType
à partir du flux d’entrée associé. Le deuxième opérateur effectue une copie de l’objet, incrémente l’objet, puis retourne la copie.
Le premier opérateur de préincrément incrémente l’objet itérateur de sortie stocké, puis retourne *this
.
Le deuxième opérateur de postincrement effectue une copie de , incrémente l’objet itérateur de *this
sortie stocké, puis retourne la copie.
Le constructeur stocke first
comme objet itérateur de sortie.
Exemple
// 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
Construit un itérateur de stockage brut avec un itérateur de sortie sous-jacent spécifié.
explicit raw_storage_iterator(ForwardIterator first);
Paramètres
first
Itérateur vers l’avant devant être sous-jacent à l’objet raw_storage_iterator
construit.
Exemple
// 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