30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

514 16. Die <strong>C++</strong> Standard Library<br />

Programmteil <strong>in</strong> se<strong>in</strong>er Arbeit des Durchwanderns bee<strong>in</strong>flusst, solange dieser<br />

e<strong>in</strong>en eigenen Iterator besitzt.<br />

E<strong>in</strong> Iterator bezieht sich also auf das aktuelle Element und über ihn f<strong>in</strong>det<br />

auch die “Navigation” durch den Conta<strong>in</strong>er statt. Navigation über Iterators<br />

bedeutet, dass man die Elemente e<strong>in</strong>es Conta<strong>in</strong>ers immer <strong>in</strong> e<strong>in</strong>er bestimmten<br />

Ordnung zu Gesicht bekommt, die man vorwärts oder rückwärts durchlaufen<br />

kann. Man bewegt sich dabei immer um e<strong>in</strong> Element <strong>in</strong> e<strong>in</strong>e Richtung. Salopp<br />

gesagt bedeutet dies, dass sich die Elemente e<strong>in</strong>es Conta<strong>in</strong>ers durch den<br />

Iterator so präsentieren, als wären sie <strong>in</strong> e<strong>in</strong>er verketteten Liste gespeichert.<br />

Jede Navigationsoperation zum nächsten, vorherigen oder welchem anderen<br />

Element auch immer, verändert das aktuelle Element, auf das der Iterator<br />

zeigt. Je nachdem, was man nun tun will, gibt es e<strong>in</strong>e Reihe verschiedener<br />

Typen von Iterators, die neben der Navigation die e<strong>in</strong>e oder andere besondere<br />

Zusatzaufgabe zu erledigen haben:<br />

• Es gibt solche, die nur zum lesenden Zugriff auf Elemente verwendet werden.<br />

Wenn e<strong>in</strong>fach nur von Iterator die Rede ist, s<strong>in</strong>d <strong>in</strong> der Regel genau<br />

diese geme<strong>in</strong>t.<br />

• Es gibt solche, die dazu verwendet werden, <strong>in</strong> e<strong>in</strong>e Datenstruktur an e<strong>in</strong>er<br />

bestimmten Stelle, die man vorher heraussucht, Elemente e<strong>in</strong>zufügen. Solche<br />

werden im allgeme<strong>in</strong>en Sprachgebrauch von Softwareentwicklern als<br />

Inserters bezeichnet. Man kann sich leicht vorstellen, dass beim Erlauben<br />

von schreibenden Zugriffen e<strong>in</strong> erheblicher Synchronisationsaufwand<br />

vonnöten ist, um nicht Inkonsistenzen <strong>in</strong> anderen Programmteilen zu verursachen,<br />

die gleichzeitig e<strong>in</strong>en Conta<strong>in</strong>er lesender- oder ebenfalls schreibenderweise<br />

iterieren.<br />

• Es gibt solche, die man ganz bewusst zum verkehrten Durchlaufen e<strong>in</strong>er<br />

Datenstruktur verwendet. Diese werden als reverse Iterators bezeichnet,<br />

wenn sie nur für den lesenden Zugriff gedacht s<strong>in</strong>d, als reverse Inserters,<br />

wenn sie auch zum E<strong>in</strong>fügen von Elementen gedacht s<strong>in</strong>d. Warum die<br />

Bezeichnung reverse so besonders herausgestrichen wird, wird <strong>in</strong> Abbildung<br />

16.1 skizziert.<br />

• Es gibt dann auch noch den Typ der Checked Iterators, die sich dadurch<br />

auszeichnen, dass bei Navigationsoperationen überprüft wird, ob diese<br />

Operation beim aktuellen Inhalt des Conta<strong>in</strong>ers überhaupt noch möglich<br />

ist (z.B. nach dem Ende e<strong>in</strong>er Sequence kann man nicht noch e<strong>in</strong>mal um<br />

e<strong>in</strong> Element weiter rücken).<br />

In der STL s<strong>in</strong>d für alle verschiedenen Conta<strong>in</strong>er entsprechende Iterators<br />

def<strong>in</strong>iert. Wenn man e<strong>in</strong>en Iterator von e<strong>in</strong>em Conta<strong>in</strong>er anfordert, so kann<br />

man dies pr<strong>in</strong>zipiell auf e<strong>in</strong>e der folgenden vier Arten tun, die den Startpunkt<br />

der folgenden Navigationsoperationen def<strong>in</strong>ieren:<br />

beg<strong>in</strong> fordert e<strong>in</strong>en Iterator an, der auf das erste Element im Conta<strong>in</strong>er<br />

zeigt. E<strong>in</strong> Anfordern des Elements vom Iterator liefert also das erste<br />

Element.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!