Iteratoren
|
49
size_type capacity( ) const
Gibt die maximale Anzahl von Elementen zurück, die im Vek-
tor gespeichert werden können, bevor er vergrößert werden
muss. Die Komplexität ist konstant.
void reserve(size_type n)
Stellt sicher, dass capacity( ) mindestens n ist. Verwenden Sie
reserve, um zu vermeiden, dass der Vektor immer wieder real-
loziert wird, wenn Sie bereits wissen, dass er um kleine Inkre-
mente auf eine bestimmte Größe anwächst, oder wenn Sie ver-
meiden wollen, dass Iteratoren beim Einfügen eines oder
mehrerer Elemente ungültig werden. Beachten Sie, dass sich
size( ) dabei nicht ändert. Die Komplexität ist linear.
void resize(size_type sz, T t = T( ))
Ändert die Größe von this auf n. Falls n > size( ), wird eine
oder mehrere Kopien von
t an das Ende des Vektors ange-
hängt, bis die gewünschte Größe erreicht wird. Falls die neue
Größe kleiner als die aktuelle Größe ist, werden die Elemente
am Ende des Vektors gelöscht. Die Komplexität ist linear.
Das Klassen-Template
vector implementiert die folgenden optio-
nalen Member-Funktionen:
Iteratoren
Ein Iterator ist eine Abstraktion eines Zeigers, der dazu verwendet
wird, auf Elemente in Containern und anderen Sequenzen zu zei-
gen. Ein gewöhnlicher Zeiger kann auf verschiedene Elemente in
einem Feld oder z.B. auch auf eine Position hinter dem letzten Ele-
ment eines Feldes zeigen. Der Operator
++ setzt den Zeiger auf das
nächste Element, und der Operator
* dereferenziert den Zeiger
und gibt den entsprechenden Wert aus dem Feld zurück. Iterato-
at operator[]
back pop_back
front push_back
STL kurz&gut.book Seite 49 Dienstag, 16. März 2004 11:10 11
50
|
STL – kurz & gut
ren verallgemeinern dieses Konzept, so dass dieselben Operatoren
bei jedem Container dasselbe Verhalten zeigen, sogar bei Listen
und Bäumen.
Man kann Iteratoren aus zwei verschiedenen Perspektiven betrach-
ten: aus Sicht der Implementierung und der Anwendung. Dieses
Buch behandelt nicht die Implementierung von Iteratoren. Um
einen Iterator zu verwenden, müssen Sie die Kategorie und die
Eigenschaften des Iterators kennen. Diese Themen werden in die-
sem Abschnitt zusammen mit einer Anzahl bestimmter speziali-
sierter Iteratoren behandelt. Alle in diesem Abschnitt behandelten
Funktionen und Klassen-Templates werden in der Header-Datei
<iterator> deklariert.
Iteratorkategorien
Es existieren fünf Iteratorkategorien:
Input
Damit können Sie eine Sequenz in einem Durchgang lesen. Der
Inkrementoperator (
++) springt zum nächsten Element, aber es
gibt keinen Dekrementoperator. Zum Lesen der Elemente ver-
wenden Sie den Dereferenzierungsoperator (
*). Ein einzelnes
Element kann nicht mehr als einmal gelesen werden, und die
Elemente können nicht geändert werden.
Output
Damit können Sie eine Sequenz in einem Durchgang schrei-
ben. Der Inkrementoperator (
++) springt zum nächsten Ele-
ment, aber es gibt keinen Dekrementoperator. Mit dem De-
referenzierungsoperator (
*) können Sie einem Element einen
Wert zuweisen. Einem einzelnen Element kann nicht mehr als
einmal ein Wert zugewiesen werden. Anders als die anderen
Iteratorkategorien können Output-Iteratoren nicht verglichen
werden.
Forward
Erlaubt den unidirektionalen Zugriff auf eine Sequenz. Mit
dem Inkrementoperator (
++) springt der Iterator zum nächsten
Element, und mit dem Dereferenzierungsoperator (
*) können
STL kurz&gut.book Seite 50 Dienstag, 16. März 2004 11:10 11
Iteratoren
|
51
Elemente gelesen oder geschrieben werden. Man kann auf ein
Element beliebig oft lesend oder schreibend zugreifen. Man
kann einen Forward-Iterator überall dort einsetzen, wo ein
Input- oder ein Output-Iterator erwartet wird.
Bidirectional
Wie der Forward-Iterator, unterstützt aber außerdem den
Dekrementoperator (
--), um den Iterator um eine Position
zurück zu bewegen.
Random access
Wie ein bidirektionaler Iterator, unterstützt aber außerdem
den Indexoperator
[] für den Zugriff auf ein beliebiges Ele-
ment in der Sequenz. Man kann auch einen Integer addieren
oder subtrahieren und den Random-Access-Iterator so um
mehr als eine Position auf einmal bewegen. Die Subtraktion
zweier Random-Access-Iteratoren liefert einen Integer als Dis-
tanz zwischen den Iteratoren. Ein Random-Access-Iterator
ähnelt also an ehesten einem gewöhnlichen Zeiger, und ein
Zeiger kann als Random-Access-Iterator verwendet werden.
Ein Input-, Forward-, Bidirectional- oder Random-Access-Iterator
kann ein
const_iterator sein. Das Dereferenzieren eines const_
iterator
liefert einen konstanten Wert; ansonsten verhält er sich,
wie oben beschrieben wurde. Weitere Details finden Sie weiter
hinten im Abschnitt »const_iterator«.
Die Verwendung von Iteratoren
Beim Umgang mit Iteratoren müssen Sie unbedingt daran denken,
dass diese potenziell unsicher sind. Wie ein Zeiger kann auch ein
Iterator auf einen Container zeigen, der zerstört wurde, oder auf
ein gelöschtes Element. Sie können einen Iterator hinter das Ende
eines Containers zeigen lassen, genau wie ein Zeiger hinter das
Ende eines Feldes zeigen kann. Mit etwas Vorsicht sind Iteratoren
jedoch sicher in der Anwendung.
Der erste Grundsatz für eine sichere Verwendung von Iteratoren
besteht darin, niemals einen Iterator zu dereferenzieren, der das
Ende eines Bereichs markiert. Ein typischer Einsatz von Iteratoren
STL kurz&gut.book Seite 51 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.