Classe allocator
Il modello di classe descrive un oggetto che gestisce l'allocazione dell'archiviazione e libera per matrici di oggetti di tipo Type
. Un oggetto della classe è l'oggetto allocatore predefinito specificato nei costruttori per diversi modelli di classe allocator
contenitore nella libreria standard C++.
Sintassi
template <class Type>
class allocator
Parametri
Type
Tipo di oggetto per cui è in corso l'allocazione o la deallocazione dell'archiviazione.
Osservazioni:
Tutti i contenitori della libreria standard C++ hanno un parametro di modello che per impostazione predefinita è allocator
. La creazione di un contenitore con un allocatore personalizzato consente di controllare l'allocazione e liberare gli elementi del contenitore.
Ad esempio, un oggetto allocatore potrebbe allocare spazio di archiviazione in un heap privato o nella memoria condivisa o potrebbe ottimizzare per le dimensioni piccole o grandi dell'oggetto. Potrebbe anche specificare, attraverso le definizioni di tipo fornite, che è possibile accedere agli elementi con speciali oggetti funzione di accesso che gestiscono la memoria condivisa o eseguono operazioni automatiche di Garbage Collection. Di conseguenza, una classe che alloca memoria usando un oggetto allocatore deve usare questi tipi per il puntatore di dichiarazione e gli oggetti di riferimento, proprio come i contenitori della libreria standard C++.
(solo C++98/03) Quando si deriva dalla classe allocatore, è necessario fornire uno struct di associazione , il cui _Other
typedef fa riferimento alla classe appena derivata.
Di conseguenza, un allocatore definisce i tipi seguenti:
il puntatore si comporta come un puntatore a
Type
.il riferimento si comporta come un riferimento a
Type
.const_reference si comporta come un riferimento const a
Type
.
Questi Type
elementi specificano il formato che i puntatori e i riferimenti devono accettare per gli elementi allocati. ( allocator::p ointer non è necessariamente uguale Type*
a per tutti gli oggetti allocatore, anche se ha questa definizione ovvia per la classe allocator
.)
C++11 e versioni successive: per abilitare le operazioni di spostamento nell'allocatore, usare l'interfaccia dell'allocatore minimo e implementare il costruttore di copia, gli operatori == e !=, allocate e deallocate. Per altre informazioni e un esempio, vedere Allocatori
Membri
Costruttori
Nome | Descrizione |
---|---|
allocator | Costruttori usati per la creazione di oggetti allocator . |
Typedef
Nome | Descrizione |
---|---|
const_pointer | Tipo che fornisce un puntatore costante al tipo di oggetto gestito dall'allocatore. |
const_reference | Tipo che fornisce un riferimento costante al tipo di oggetto gestito dall'allocatore. |
difference_type | Tipo integrale con segno che può rappresentare la differenza tra valori di puntatori al tipo di oggetto gestito dall'allocatore. |
pointer | Tipo che fornisce un puntatore al tipo di oggetto gestito dall'allocatore. |
reference | Tipo che fornisce un riferimento al tipo di oggetto gestito dall'allocatore. |
size_type | Tipo integrale senza segno che può rappresentare la lunghezza di qualsiasi sequenza che un oggetto di tipo allocator può allocare. |
value_type | Tipo gestito dall'allocatore. |
Funzioni
Nome | Descrizione |
---|---|
address | Trova l'indirizzo di un oggetto il cui valore è specificato. |
allocate | Alloca un blocco di memoria sufficiente a contenere almeno un numero specificato di elementi. |
construct | Costruisce un tipo specifico di oggetto su un indirizzo specificato che viene inizializzato con un valore specificato. |
deallocate | Libera un numero specificato di oggetti dall'archiviazione iniziando da una posizione specificata. |
destroy | Chiama un distruttore di oggetti senza deallocare la memoria in cui è stato archiviato l'oggetto. |
max_size | Restituisce il numero di elementi di tipo Type che potrebbe essere assegnata da un oggetto della classe allocator prima che la memoria libera si esaurisca. |
rebind | Una struttura che consente a un allocatore per gli oggetti di un unico tipo di allocare memoria per gli oggetti di un altro tipo. |
Operatori
Nome | Descrizione |
---|---|
operator= | Assegna un oggetto allocator a un altro oggetto allocator . |
address
Trova l'indirizzo di un oggetto il cui valore è specificato.
pointer address(reference val) const;
const_pointer address(const_reference val) const;
Parametri
val
Valore const o nonconst dell'oggetto di cui viene cercato l'indirizzo.
Valore restituito
Un puntatore const o nonconst all'oggetto trovato rispettivamente di valore const o nonconst.
Osservazioni:
Le funzioni membro restituiscono l'indirizzo di val, nel formato che i puntatori devono accettare per gli elementi allocati.
Esempio
// allocator_address.cpp
// compile with: /EHsc
#include <memory>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
vector <int> v1;
vector <int>::iterator v1Iter;
vector <int>:: allocator_type v1Alloc;
int i;
for ( i = 1 ; i <= 7 ; i++ )
{
v1.push_back( 2 * i );
}
cout << "The original vector v1 is:\n ( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ; v1Iter++ )
cout << *v1Iter << " ";
cout << ")." << endl;
allocator<int>::const_pointer v1Ptr;
const int k = 8;
v1Ptr = v1Alloc.address( *find(v1.begin( ), v1.end( ), k) );
// v1Ptr = v1Alloc.address( k );
cout << "The integer addressed by v1Ptr has a value of: "
<< "*v1Ptr = " << *v1Ptr << "." << endl;
}
The original vector v1 is:
( 2 4 6 8 10 12 14 ).
The integer addressed by v1Ptr has a value of: *v1Ptr = 8.
allocate
Alloca un blocco di memoria sufficiente a contenere almeno un numero specificato di elementi.
pointer allocate(size_type count, const void* _Hint);
Parametri
count
Numero di elementi per cui deve essere allocato spazio di archiviazione sufficiente.
_Hint
Puntatore const che può essere utile all'oggetto allocatore per soddisfare la richiesta di spazio di archiviazione individuando l'indirizzo di un oggetto allocato prima della richiesta.
Valore restituito
Un puntatore all'oggetto allocato o null se non è stata allocata memoria.
Osservazioni:
La funzione membro alloca l'archiviazione per una matrice di elementi count di tipo Type
, chiamando l'operatore new(count). Restituisce un puntatore all'oggetto allocato. L'argomento hint consente ad alcuni allocatori di migliorare la posizione del riferimento. Una scelta valida è l'indirizzo di un oggetto allocato in precedenza dallo stesso oggetto allocatore e non ancora deallocato. Per non specificare hint, usare un argomento di puntatore null.
Esempio
// allocator_allocate.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
allocator<int> v1Alloc;
allocator<int>::pointer v1aPtr;
v1aPtr = v1Alloc.allocate ( 10 );
int i;
for ( i = 0 ; i < 10 ; i++ )
{
v1aPtr[ i ] = i;
}
for ( i = 0 ; i < 10 ; i++ )
{
cout << v1aPtr[ i ] << " ";
}
cout << endl;
v1Alloc.deallocate( v1aPtr, 10 );
}
0 1 2 3 4 5 6 7 8 9
allocator
Costruttori usati per la creazione di oggetti allocatore.
allocator();
allocator(const allocator<Type>& right);
template <class Other>
allocator(const allocator<Other>& right);
Parametri
right
Oggetto allocatore da copiare.
Osservazioni:
Il costruttore non esegue alcuna operazione. In generale, tuttavia, un oggetto allocatore costruito da un altro oggetto allocatore dovrebbe essere uguale e consentire una combinazione di allocazione di oggetti e il rilascio tra i due oggetti allocatore.
Esempio
// allocator_allocator.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Int {
public:
Int( int i )
{
cout << "Constructing " << ( void* )this << endl;
x = i;
bIsConstructed = true;
};
~Int( )
{
cout << "Destructing " << ( void* )this << endl;
bIsConstructed = false;
};
Int &operator++( )
{
x++;
return *this;
};
int x;
private:
bool bIsConstructed;
};
int main( )
{
allocator<double> Alloc;
vector <Int>:: allocator_type v1Alloc;
allocator<double> cAlloc(Alloc);
allocator<Int> cv1Alloc(v1Alloc);
if ( cv1Alloc == v1Alloc )
cout << "The allocator objects cv1Alloc & v1Alloc are equal."
<< endl;
else
cout << "The allocator objects cv1Alloc & v1Alloc are not equal."
<< endl;
if ( cAlloc == Alloc )
cout << "The allocator objects cAlloc & Alloc are equal."
<< endl;
else
cout << "The allocator objects cAlloc & Alloc are not equal."
<< endl;
}
The allocator objects cv1Alloc & v1Alloc are equal.
The allocator objects cAlloc & Alloc are equal.
const_pointer
Tipo che fornisce un puntatore costante al tipo di oggetto gestito dall'allocatore.
typedef const value_type *const_pointer;
Osservazioni:
Il tipo di puntatore descrive un oggetto ptr
che può designare, tramite l'espressione *ptr
, qualsiasi oggetto const che un oggetto di tipo allocator
può allocare.
Esempio
// allocator_const_ptr.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
vector <int> v1;
vector <int>::iterator v1Iter;
vector <int>:: allocator_type v1Alloc;
int i;
for ( i = 1 ; i <= 7 ; i++ )
{
v1.push_back( i * 2 );
}
cout << "The original vector v1 is:\n ( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ; v1Iter++ )
cout << *v1Iter << " ";
cout << ")." << endl;
allocator<int>::const_pointer v1Ptr;
const int k = 10;
v1Ptr = v1Alloc.address( k );
cout << "The integer's address found has a value of: "
<< *v1Ptr << "." << endl;
}
The original vector v1 is:
( 2 4 6 8 10 12 14 ).
The integer's address found has a value of: 10.
const_reference
Tipo che fornisce un riferimento costante al tipo di oggetto gestito dall'allocatore.
typedef const value_type& const_reference;
Osservazioni:
Il tipo riferimento descrive un oggetto che può designare qualsiasi oggetto const che un oggetto di tipo allocator
può allocare.
Esempio
// allocator_const_ref.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
vector <double> v;
vector <double> ::iterator vIter, vfIter;
vector <double> :: allocator_type vAlloc;
int j;
for ( j = 1 ; j <= 7 ; j++ )
{
v.push_back( 100.0 * j );
}
cout << "The original vector v is:\n ( " ;
for ( vIter = v.begin( ) ; vIter != v.end( ) ; vIter++ )
cout << *vIter << " ";
cout << ")." << endl;
vfIter = v.begin( );
allocator<double>::const_reference vcref =*vfIter;
cout << "The value of the element referred to by vref is: "
<< vcref << ",\n the first element in the vector." << endl;
// const references can have their elements modified,
// so the following would generate an error:
// vcref = 150;
// but the value of the first element could be modified through
// its nonconst iterator and the const reference would remain valid
*vfIter = 175;
cout << "The value of the element referred to by vcref,"
<<"\n after nofication through its nonconst iterator, is: "
<< vcref << "." << endl;
}
The original vector v is:
( 100 200 300 400 500 600 700 ).
The value of the element referred to by vref is: 100,
the first element in the vector.
The value of the element referred to by vcref,
after nofication through its nonconst iterator, is: 175.
construct
Costruisce un tipo specifico di oggetto su un indirizzo specificato che viene inizializzato con un valore specificato.
void construct(pointer ptr, const Type& val);
void construct(pointer ptr, Type&& val);
template <class _Other>
void construct(pointer ptr, _Other&&... val);
Parametri
ptr
Puntatore al percorso in cui deve essere creato l'oggetto.
val
Il valore con cui viene inizializzato l'oggetto costruito.
Osservazioni:
La prima funzione membro equivale a new ((void *) ptr) Type(val)
.
Esempio
// allocator_construct.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main( )
{
vector <int> v1;
vector <int>::iterator v1Iter;
vector <int>:: allocator_type v1Alloc;
int i;
for ( i = 1 ; i <= 7 ; i++ )
{
v1.push_back( 3 * i );
}
cout << "The original vector v1 is:\n ( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ; v1Iter++ )
cout << *v1Iter << " ";
cout << ")." << endl;
allocator<int>::pointer v1PtrA;
int kA = 6, kB = 7;
v1PtrA = v1Alloc.address( *find( v1.begin( ), v1.end( ), kA ) );
v1Alloc.destroy ( v1PtrA );
v1Alloc.construct ( v1PtrA , kB );
cout << "The modified vector v1 is:\n ( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ; v1Iter++ )
cout << *v1Iter << " ";
cout << ")." << endl;
}
The original vector v1 is:
( 3 6 9 12 15 18 21 ).
The modified vector v1 is:
( 3 7 9 12 15 18 21 ).
deallocate
Libera un numero specificato di oggetti dall'archiviazione iniziando da una posizione specificata.
void deallocate(pointer ptr, size_type count);
Parametri
ptr
Puntatore al primo oggetto da deallocare dall'archivio.
count
Numero di oggetti da deallocare dall'archivio.
Osservazioni:
La funzione membro libera l'archiviazione per la matrice di oggetti count di tipo Type
a partire da ptr, chiamando operator delete(ptr)
. Il puntatore ptr deve essere stato restituito in precedenza da una chiamata per allocare per un oggetto allocatore che confronta uguale a *, allocando un oggetto matrice con le stesse dimensioni e tipo. deallocate
non genera mai un'eccezione.
Esempio
Per un esempio di utilizzo della funzione membro, vedere allocator::allocate.
destroy
Chiama un distruttore di oggetti senza deallocare la memoria in cui è stato archiviato l'oggetto.
void destroy(pointer ptr);
Parametri
ptr
Un puntatore che indica l'indirizzo dell'oggetto da distruggere.
Osservazioni:
La funzione membro elimina definitivamente l'oggetto designato da ptr, chiamando il distruttore ptr->Type::~Type
.
Esempio
// allocator_destroy.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main( )
{
vector <int> v1;
vector <int>::iterator v1Iter;
vector <int>:: allocator_type v1Alloc;
int i;
for ( i = 1 ; i <= 7 ; i++ )
{
v1.push_back( 2 * i );
}
cout << "The original vector v1 is:\n ( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ; v1Iter++ )
cout << *v1Iter << " ";
cout << ")." << endl;
allocator<int>::pointer v1PtrA;
int kA = 12, kB = -99;
v1PtrA = v1Alloc.address( *find(v1.begin( ), v1.end( ), kA) );
v1Alloc.destroy ( v1PtrA );
v1Alloc.construct ( v1PtrA , kB );
cout << "The modified vector v1 is:\n ( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ; v1Iter++ )
cout << *v1Iter << " ";
cout << ")." << endl;
}
The original vector v1 is:
( 2 4 6 8 10 12 14 ).
The modified vector v1 is:
( 2 4 6 8 10 -99 14 ).
difference_type
Tipo integrale con segno che può rappresentare la differenza tra valori di puntatori al tipo di oggetto gestito dall'allocatore.
typedef ptrdiff_t difference_type;
Osservazioni:
Il tipo integer con segno descrive un oggetto che può rappresentare la differenza tra gli indirizzi di due elementi in una sequenza che un oggetto di tipo allocator
può allocare.
Esempio
// allocator_diff_type.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
vector <int> v1;
vector <int>::iterator v1Iter;
vector <int>:: allocator_type v1Alloc;
int i;
for ( i = 0 ; i <= 7 ; i++ )
{
v1.push_back( i * 2 );
}
cout << "The original vector v1 is:\n ( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ; v1Iter++ )
cout << *v1Iter << " ";
cout << ")." << endl;
allocator<int>::const_pointer v1PtrA, v1PtrB;
const int kA = 4, kB =12;
v1PtrA = v1Alloc.address( kA );
v1PtrB = v1Alloc.address( kB );
allocator<int>::difference_type v1diff = *v1PtrB - *v1PtrA;
cout << "Pointer v1PtrA addresses " << *v1PtrA << "." << endl;
cout << "Pointer v1PtrB addresses " << *v1PtrB << "." << endl;
cout << "The difference between the integer's addresses is: "
<< v1diff << "." << endl;
}
The original vector v1 is:
( 0 2 4 6 8 10 12 14 ).
Pointer v1PtrA addresses 4.
Pointer v1PtrB addresses 12.
The difference between the integer's addresses is: 8.
max_size
Restituisce il numero di elementi di tipo Type
che potrebbe essere assegnata da un oggetto dell'allocatore della classe prima che la memoria libera si esaurisca.
size_type max_size() const;
Valore restituito
Numero degli elementi che possono essere allocati.
Esempio
// allocator_max_size.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
vector <int> v1;
vector <int>::iterator v1Iter;
vector <int>:: allocator_type v1Alloc;
int i;
for ( i = 1 ; i <= 7 ; i++ )
{
v1.push_back( i );
}
cout << "The original vector v1 is:\n ( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ; v1Iter++ )
cout << *v1Iter << " ";
cout << ")." << endl;
vector <double> v2;
vector <double> ::iterator v2Iter;
vector <double> :: allocator_type v2Alloc;
allocator<int>::size_type v1size;
v1size = v1Alloc.max_size( );
cout << "The number of integers that can be allocated before\n"
<< " the free memory in the vector v1 is used up is: "
<< v1size << "." << endl;
int ii;
for ( ii = 1 ; ii <= 7 ; ii++ )
{
v2.push_back( ii * 10.0 );
}
cout << "The original vector v2 is:\n ( " ;
for ( v2Iter = v2.begin( ) ; v2Iter != v2.end( ) ; v2Iter++ )
cout << *v2Iter << " ";
cout << ")." << endl;
allocator<double>::size_type v2size;
v2size = v2Alloc.max_size( );
cout << "The number of doubles that can be allocated before\n"
<< " the free memory in the vector v2 is used up is: "
<< v2size << "." << endl;
}
operator=
Assegna un oggetto allocatore a un altro oggetto allocatore.
template <class Other>
allocator<Type>& operator=(const allocator<Other>& right);
Parametri
right
Oggetto allocatore da assegnare a un altro oggetto di questo tipo.
Valore restituito
Un riferimento all'oggetto allocatore
Osservazioni:
L'operatore di assegnazione del modello non esegue alcuna operazione. In generale, tuttavia, un oggetto allocatore assegnato a un altro oggetto allocatore dovrebbe essere uguale e consentire una combinazione di allocazione di oggetti e il rilascio tra i due oggetti allocatore.
Esempio
// allocator_op_assign.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Int {
public:
Int(int i)
{
cout << "Constructing " << ( void* )this << endl;
x = i;
bIsConstructed = true;
};
~Int( ) {
cout << "Destructing " << ( void* )this << endl;
bIsConstructed = false;
};
Int &operator++( )
{
x++;
return *this;
};
int x;
private:
bool bIsConstructed;
};
int main( )
{
allocator<Int> Alloc;
allocator<Int> cAlloc ;
cAlloc = Alloc;
}
pointer
Tipo che fornisce un puntatore al tipo di oggetto gestito dall'allocatore.
typedef value_type *pointer;
Osservazioni:
Il tipo di puntatore descrive un oggetto ptr
che può designare, tramite l'espressione *ptr, qualsiasi oggetto che un oggetto di tipo allocator
può allocare.
Esempio
// allocator_ptr.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
vector <int> v1;
vector <int>::iterator v1Iter;
vector <int>:: allocator_type v1Alloc;
int i;
for ( i = 1 ; i <= 7 ; i++ )
{
v1.push_back( 3 * i );
}
cout << "The original vector v1 is:\n( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ; v1Iter++ )
cout << *v1Iter << " ";
cout << ")." << endl;
allocator<int>::const_pointer v1Ptr;
const int k = 12;
v1Ptr = v1Alloc.address( k );
cout << "The integer addressed by v1Ptr has a value of: "
<< "*v1Ptr = " << *v1Ptr << "." << endl;
}
The original vector v1 is:
( 3 6 9 12 15 18 21 ).
The integer addressed by v1Ptr has a value of: *v1Ptr = 12.
rebind
Una struttura che consente a un allocatore per gli oggetti di un unico tipo di allocare memoria per gli oggetti di un altro tipo.
struct rebind { typedef allocator<_Other> other; };
Parametri
other
Tipo di elemento per il quale viene allocata la memoria.
Osservazioni:
Questa struttura è utile per l'allocazione di memoria per un tipo diverso dal tipo di elemento del contenitore in fase di implementazione.
Il modello di classe membro definisce il tipo altro. L'unico scopo è fornire il nome allocator<_Other>
del tipo , dato il nome allocator<Type>
del tipo .
Ad esempio, dato un oggetto al
allocatore di tipo A
, è possibile allocare un oggetto di tipo _Other
con l'espressione :
A::rebind<Other>::other(al).allocate(1, (Other *)0)
In alternativa, è possibile denominare il tipo di puntatore scrivendo il tipo:
A::rebind<Other>::other::pointer
Esempio
// allocator_rebind.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef vector<int>::allocator_type IntAlloc;
int main( )
{
IntAlloc v1Iter;
vector<int> v1;
IntAlloc::rebind<char>::other::pointer pszC =
IntAlloc::rebind<char>::other(v1.get_allocator()).allocate(1, (void *)0);
int * pInt = v1Iter.allocate(10);
}
reference
Tipo che fornisce un riferimento al tipo di oggetto gestito dall'allocatore.
typedef value_type& reference;
Osservazioni:
Il tipo riferimento descrive un oggetto che può designare qualsiasi oggetto che un oggetto di tipo allocator
può allocare.
Esempio
// allocator_reference.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
vector <double> v;
vector <double> ::iterator vIter, vfIter;
vector <double> :: allocator_type vAlloc;
int j;
for ( j = 1 ; j <= 7 ; j++ )
{
v.push_back( 100.0 * j );
}
cout << "The original vector v is:\n ( " ;
for ( vIter = v.begin( ) ; vIter != v.end( ) ; vIter++ )
cout << *vIter << " ";
cout << ")." << endl;
vfIter = v.begin( );
allocator<double>::reference vref =*vfIter;
cout << "The value of the element referred to by vref is: "
<< vref << ",\n the first element in the vector." << endl;
// nonconst references can have their elements modified
vref = 150;
cout << "The element referred to by vref after being modified is: "
<< vref << "." << endl;
}
The original vector v is:
( 100 200 300 400 500 600 700 ).
The value of the element referred to by vref is: 100,
the first element in the vector.
The element referred to by vref after being modified is: 150.
size_type
Tipo integrale senza segno che può rappresentare la lunghezza di qualsiasi sequenza che un oggetto di tipo allocator
può allocare.
typedef size_t size_type;
Esempio
// allocator_size_type.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
vector <double> v;
vector <double> ::iterator vIter;
vector <double> :: allocator_type vAlloc;
int j;
for ( j = 1 ; j <= 7 ; j++ )
{
v.push_back( 100.0 * j );
}
cout << "The original vector v is:\n ( " ;
for ( vIter = v.begin( ) ; vIter != v.end( ) ; vIter++ )
cout << *vIter << " ";
cout << ")." << endl;
allocator<double>::size_type vsize;
vsize = vAlloc.max_size( );
cout << "The number of doubles that can be allocated before\n"
<< " the free memory in the vector v is used up is: "
<< vsize << "." << endl;
}
value_type
Tipo gestito dall'allocatore.
typedef Type value_type;
Osservazioni:
Il tipo è un sinonimo del parametro di modello Type
.
Esempio
// allocator_value_type.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
vector <double> v;
vector <double> ::iterator vIter, vfIter;
vector <double> :: allocator_type vAlloc;
int j;
for ( j = 1 ; j <= 7 ; j++ )
{
v.push_back( 100.0 * j );
}
cout << "The original vector v is:\n ( " ;
for ( vIter = v.begin( ) ; vIter != v.end( ) ; vIter++ )
cout << *vIter << " ";
cout << ")." << endl;
vfIter = v.begin( );
allocator<double>::value_type vecVal = 150.0;
*vfIter = vecVal;
cout << "The value of the element addressed by vfIter is: "
<< *vfIter << ",\n the first element in the vector." << endl;
cout << "The modified vector v is:\n ( " ;
for ( vIter = v.begin( ) ; vIter != v.end( ) ; vIter++ )
cout << *vIter << " ";
cout << ")." << endl;
}
The original vector v is:
( 100 200 300 400 500 600 700 ).
The value of the element addressed by vfIter is: 150,
the first element in the vector.
The modified vector v is:
( 150 200 300 400 500 600 700 ).
Helper
allocator_arg_t
struct allocator_arg_t { explicit allocator_arg_t() = default; };
inline constexpr allocator_arg_t allocator_arg{};
uses_allocator
template <class T, class Alloc> struct uses_allocator;