Verschiedenes
|
101
Verschiedenes
Dieser Abschnitt beschreibt die Klassen-Templates allocator,
auto_ptr und bitset. Diese Klassen-Templates passen nicht in die
anderen Abschnitte.
Allokatoren
Ein Allokator ist eine Abstraktion der Ausdrücke new und delete.
Die Standard-Container verwenden Allokatoren zum Allozieren
und zum Freigeben von Speicher und zum Erzeugen und Zerstö-
ren der Objekte, die sich in einem Container befinden.
Die Standardbibliothek definiert das Klassen-Template
allocator,
den Default-Allokator für alle Standard-Container. Sie können
einen anderen Allokator bereitstellen, solange dieser dieselbe
Schnittstelle verwendet wie der Standard-Allokator.
Die Implementierung eines neuen Allokators ist schwieriger, als es
auf den ersten Blick scheint und sprengt den Rahmen dieses
Buches. Dieser Abschnitt beschreibt, wie das Klassen-Template
allocator verwendet wird.
Hier sind die Typdefinitionen von
allocator:
typedef const T* const_pointer
Ein Typ für einen Zeiger auf einen const-Wert.
typedef const T& const_reference
Ein Typ für einen const-LWert.
typedef ptrdiff_t difference_type
Ein Typ, um die Differenz zwischen zwei Zeigern zu repräsen-
tieren, die der Allokator beim Aufruf von
allocate( ) zurück-
gibt.
typedef T* pointer
Ein Zeigertyp.
template <class U> struct rebind
Bindet das Allokator-Objekt an einen anderen Werttyp. Die
Klasse
rebind hat ein einziges typedef, nämlich other, eine
STL kurz&gut.book Seite 101 Dienstag, 16. März 2004 11:10 11
102
|
STL – kurz & gut
Instanz von allocator, allerdings mit U als Template-Parameter.
Das Template
rebind wird für Standard-Container benötigt, die
Hilfsobjekte, wie z.B. Link-Nodes, allozieren und nicht direkt
Werte. Wenn Sie keinen Standard-Container implementieren,
müssen Sie
rebind wahrscheinlich nie verwenden.
typedef T& reference
Ein LWert-Typ.
typedef size_t size_type
Ein Typ, der die Größe der maximalen Allokationsanfrage
repräsentieren kann.
typedef T value_type
Der Typ der allozierten Werte.
Im Folgenden werden die Member-Funktionen von
allocator
beschrieben:
allocator() throw()
allocator(const allocator&) throw( )
template<class U> allocator(const allocator<U>&) throw( )
Erzeugt ein neues Allokator-Objekt, wobei eventuell ein exis-
tierender Allokator kopiert wird.
pointer address(reference x) const
const_pointer address(const_reference x) const
Gibt die Adresse von x zurück, also &x.
pointer allocate(size_type n,allocator<void>::
const_pointer hint = 0)
Ruft den globalen operator new auf, um genug Speicher für n
Objekte vom Typ T zu allozieren. Das Argument hint muss 0
sein oder ein Zeiger, der von einem früheren Aufruf von allo-
cate
stammt und noch nicht an deallocate übergeben wurde.
Der Rückgabewert ist ein Zeiger auf den neu allozierten Spei-
cher. Wenn der Speicher nicht alloziert werden konnte, wird
die Ausnahme
bad_alloc ausgelöst.
STL kurz&gut.book Seite 102 Dienstag, 16. März 2004 11:10 11
Verschiedenes
|
103
void construct(pointer p, const T& val)
Erzeugt eine Kopie von val an der Adresse p, unter Verwen-
dung des globalen Placement-
new.
void deallocate(pointer p, size_type n)
Ruft den globalen operator delete auf, um den Speicher freizu-
geben, auf den
p zeigt. Das Argument n entspricht der Anzahl
der Elemente vom Typ
T und ist derselbe Wert, der an allo-
cate
übergeben wurde.
void destroy(pointer p)
Ruft den Destruktor des Objekts an der Adresse p auf. Das
heißt, es wird
reinterpret_cast<T*>(p)->~T( ) aufgerufen.
size_type max_size( ) const throw( )
Gibt die maximale Größe zurück, die an allocate übergeben
werden kann.
Der Standard definiert die Template-Spezialisierung
allocate
<void>
, bei der allocate, construct usw. nicht deklariert werden,
da man kein Objekt vom Typ
void erzeugen kann. Sie können aber
die Member
pointer, const_pointer und rebind verwenden.
Die Vergleichsoperatoren (
operator== und operator!=) werden so
überladen, dass ein
allocator-Objekt unabhängig vom Typ der
Werte gleich allen anderen
allocator-Objekten ist.
Bitset
Bei einem bitset handelt es sich um eine gepackte Sequenz von
Bits mit einer festen Größe. Dabei handelt sich nicht um einen
Standard-Container, und es werden auch keine Iteratoren unter-
stützt.
Das Klassen-Template
bitset erwartet nur einen Template-Para-
meter
N, der die Anzahl der Bits angibt. Er wird in der Header-
Datei
<bitset> deklariert.
Ein Bit kann gesetzt (eins) oder nicht gesetzt (null) sein. Das Flip-
ping eines Bits ist das Umschalten von eins auf null bzw. von null
auf eins. Im Folgenden werden die Member von
bitset erläutert:
STL kurz&gut.book Seite 103 Dienstag, 16. März 2004 11:10 11

Get STL kurz & gut now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.