 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Andreas Seik Guest
|
Posted: Thu May 11, 2006 12:40 pm Post subject: Iteratoren selbst implementieren |
|
|
Hallo NG,
für eine recht komplexe eigene Datenstruktur komme ich nicht mehr um STL
kompatible Iteratoren herum. Wo steht, wie man diese Implementiert? Wenn es
keine Web-Quelle gibt. Kann ich auch in der Uni-Bibliothek schauen.
Danke für jeden Hinweis
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Fri May 12, 2006 6:21 pm Post subject: Re: Iteratoren selbst implementieren |
|
|
Andreas Seik wrote:
| Quote: | für eine recht komplexe eigene Datenstruktur komme ich nicht mehr um STL
kompatible Iteratoren herum. Wo steht, wie man diese Implementiert? Wenn es
keine Web-Quelle gibt. Kann ich auch in der Uni-Bibliothek schauen.
|
Du weißt doch, was ein Iterator können muss. Und das implementierst du
halt. Du wirst halt mindestens die Operatoren "*" (Dereferenzieren),
"++" (weitersetzen, prefix/postfix) und "==" (Vergleich) brauchen. Dann
hast du einen Forward-Iterator. Der Bidirektionale kann dann noch "--",
und für den Random-Access kommt die ganze Ladung "+", "-", "<", "[]".
Die Doku der SGI STL <http://www.sgi.com/tech/stl/index.html> enthält
ein paar Beschreibungen, zum Beispiel diese
<http://www.sgi.com/tech/stl/ForwardIterator.html>.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Andreas Seik Guest
|
Posted: Fri May 12, 2006 10:25 pm Post subject: Re: Iteratoren selbst implementieren |
|
|
Stefan Reuther wrote:
| Quote: | Du weißt doch, was ein Iterator können muss.
|
Ganz so einfach finde ich das nicht.
In Java würde ich _immer_ zunächst nach Klassen suchen, von denen abzuleiten
ist. Und ich finde, das macht auch in C++ Sinn (Typensicherheit). Nur wird
man aber nicht immer fündig. Ich habe jedenfalls z.B. noch keine
forwad-iterator-Klasse gefunden die Parent aller forward-iteratoren ist.
OK - man kommt auch ohne aus. Aber diese "Es gibt kein" Aussagen sind immer
so schwer zu Beweisen :-)
Gruß
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sat May 13, 2006 10:22 am Post subject: Re: Iteratoren selbst implementieren |
|
|
Andreas Seik wrote:
| Quote: | Stefan Reuther wrote:
Du weißt doch, was ein Iterator können muss.
Ganz so einfach finde ich das nicht.
In Java würde ich _immer_ zunächst nach Klassen suchen, von denen abzuleiten
ist. Und ich finde, das macht auch in C++ Sinn (Typensicherheit). Nur wird
man aber nicht immer fündig. Ich habe jedenfalls z.B. noch keine
forwad-iterator-Klasse gefunden die Parent aller forward-iteratoren ist.
|
Die gibt es wirklich nicht. Zumindest nicht in der Form, wie du sie dir
vermutlich vorstellst. Die STL macht "Polymorphie zur Compilezeit". Da
braucht's keine Klasse, von der der Iterator abgeleitet ist. Wenn du
'std::find(mein_container.begin(), mein_container.end(), mein_wert)'
aufrufst, instanziiert der Compiler eine find-Funktion extra nur für
dich, die dann auch immer optimalen[tm] Code enthält. Er verwendet keine
Standard-find-Funktion, die per virtuellem Methodenaufruf auf die
Iteratoren zugreift.
Es gibt dennoch eine Klasse std::forward_iterator<T>, von der du
ableiten solltest. Das ist dazu da, dass fremder Code herausfinden kann,
dass es sich bei 'class AndreasTollerIterator' um einen Forward-Iterator
handelt. Das SGI Manual meint dazu:
# [1] It is not required that a Forward Iterator inherit from the base
# forward_iterator. It is, however, required that the functions
# iterator_category, distance_type, and value_type be defined for every
# Forward Iterator. (Or, if you are using the iterator_traits mechanism,
# that iterator_traits is properly specialized for every Forward
# Iterator.) Since those functions are defined for the base
# forward_iterator, the easiest way to ensure that are defined for a new
# type is to derive that class from forward_iterator and rely on the
# derived-to-base standard conversion of function arguments.
Aber, wie schon gesagt, diese Klasse enthält keinerlei sonstigen
Nährwert wie zu überschreibende abstrakte Methoden.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Christoph Kliemt Guest
|
Posted: Sat May 13, 2006 11:17 am Post subject: Re: Iteratoren selbst implementieren |
|
|
Andreas Seik <andreas_neu (AT) gmxpro (DOT) de> writes:
| Quote: | Hallo NG, fuer eine recht komplexe eigene Datenstruktur komme ich
nicht mehr um STL kompatible Iteratoren herum. Wo steht, wie man diese
Implementiert? Wenn es keine Web-Quelle gibt. Kann ich auch in der
Uni-Bibliothek schauen.
|
"The C++ Standard Library - A Tutorial and Reference" von
Nicolai M. Josuttis.
Ist auch sonst sehr zu empfehlen.
Gruss Christoph
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Hubert Schmid Guest
|
Posted: Sun May 14, 2006 12:22 pm Post subject: Re: Iteratoren selbst implementieren |
|
|
Stefan Reuther <stefan.news (AT) arcor (DOT) de> writes:
| Quote: | Es gibt dennoch eine Klasse std::forward_iterator<T>, von der du
ableiten solltest. Das ist dazu da, dass fremder Code herausfinden
kann, dass es sich bei 'class AndreasTollerIterator' um einen
Forward-Iterator handelt. Das SGI Manual meint dazu:
[..] |
In der SGI-Dokumentation steht auch, dass diese Klasse nicht zum
C++-Standard gehört, und zumindest in C++-98 gibt es sie
nicht. Stattdessen gibt es dort das Template std::iterator (24.3.2).
Gruß, Hubert
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sun May 14, 2006 2:23 pm Post subject: Re: Iteratoren selbst implementieren |
|
|
Hubert Schmid wrote:
| Quote: | Stefan Reuther <stefan.news (AT) arcor (DOT) de> writes:
Es gibt dennoch eine Klasse std::forward_iterator<T>, von der du
ableiten solltest. Das ist dazu da, dass fremder Code herausfinden
kann, dass es sich bei 'class AndreasTollerIterator' um einen
Forward-Iterator handelt. Das SGI Manual meint dazu:
[..]
In der SGI-Dokumentation steht auch, dass diese Klasse nicht zum
C++-Standard gehört, und zumindest in C++-98 gibt es sie
nicht. Stattdessen gibt es dort das Template std::iterator (24.3.2).
|
Stimmt, danke. Eigentlich wollte ich ja nachsehen, habe es aus Faulheit
dann aber doch unterlassen.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
kanze Guest
|
Posted: Mon May 15, 2006 2:22 pm Post subject: Re: Iteratoren selbst implementieren |
|
|
Andreas Seik wrote:
| Quote: | für eine recht komplexe eigene Datenstruktur komme ich nicht
mehr um STL kompatible Iteratoren herum. Wo steht, wie man
diese Implementiert? Wenn es keine Web-Quelle gibt. Kann ich
auch in der Uni-Bibliothek schauen.
|
In der meisten Dokus soll doch stehen, welche Operationen der
Iterator unterstuzen muss. Es ist aber relatif aufwendig. Dafür
gibt es boost::iterator, bei Boost, der den Aufwand vereinfacht.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|