Re: Einfache Frage zu STD::SORT
From: Holger Pollmann (hihp_at_uboot.com)
Date: 09/10/04
- Next message: Jochen Kalmbach: "Re: alternative Entwicklungsumgebung"
- Previous message: anonymous_at_discussions.microsoft.com: "Re: Zugriff auf Access-Datenbank über ODBC"
- In reply to: Ernst Baumann: "Re: Einfache Frage zu STD::SORT"
- Next in thread: Ernst Baumann: "Re: Einfache Frage zu STD::SORT"
- Reply: Ernst Baumann: "Re: Einfache Frage zu STD::SORT"
- Messages sorted by: [ date ] [ thread ]
Date: 10 Sep 2004 10:00:59 GMT
Ernst Baumann <carlox@web.de> schrieb:
>> Nein, nicht zwingend. Ein Iterator KANN ein Pointer sein, muß es
>> aber nicht.
>
> Das folgende habe ich aus der Hilfe von MS VC++ 6.0 rauskopiert.
> Daraus geht doch aber hervor, daß in MS VC++ _Version 6.0_ ein
> Iterator ein Pointer auf ein Objekt ist, also konkret, daß
> also iterator ein Pointer auf _Ty ist.
Das mag vielleicht für diese Compilerversion stimmen. Willst du dich
aber wirklich darauf verlassen? Wenn du das tust, kann es sein, daß du
in Zukunft deinen Code umschreiben mußt, wenn du auf eine neue
Compilerversion umsteigst.
Iteratoren KÖNNEN Pointer sein; insbesondere erfüllt ein pointer alle
Anforderungen, die ein Iterator erfüllen muß. Man kann Iteratoren aber
problemlos benutzen, ohne zu wissen, was sie wirklich sind, und darum
sollte man sie auch NUR so benutzen.
Im übrigen: wenn du was über die Standard-Library lernen willst, dann
wäre es schädlich, sich um die Implementierung der Iteratoren zu
kümmern. Das Konzept "Iterator" ist was anderes als das Konzept
"Pointer". Wenn du verstehen willst, was ein Iterator ist, mußt du dich
von der Pointer-Vorstellung lösen, einfach weil nicht jeder Iterator
ein Pointer ist.
> Wie gesagt, daß gilt nur für MS VC++ Version 6.0, oder seht ihr
> das anders ? (Mir geht es nicht darum recht zu haben, sondern nur
> darum, ob ich es richtig verstanden habe).
strenggenommen bedeutet das:
> typedef _A::pointer _Tptr; <------
> typedef _Tptr iterator; <------
Nur, daß ein Iterator über einen Vector vom Typ _A::pointer ist. Das
sollte zwar (schon aufgrund des Namens) ein Pointer sein, aber zwingend
wäre das natürlich nicht.
Es sollte wie gesagt auch keine Rolle spielen. Höre auf, dir einen
Iterator als Pointer vorzustellen und fange an, ihn dir als Iterator
vorzustellen,alles andere führt dich in die Irre.
>> Als Prädikat werden eben üblicherweise Funktionsobjekte
>> eingesetzt, und zum Funktionsobjekt wird ein Objekt dadurch, daß
>> es einen ()-Operator hat :-)
>
> 1) Nur zum Verständnis (siehe auch mein einfaches Demoprogramm am
> Schluß):
> Das Prädikat ist (so wie du es definiert hast) eigentlich kein
> Objekt.
Doch :-)
> Ein Prädikat ist ja nach deiner Definition eine Funktion,
> die den Datentyp bool hat. Aber eine Funktion ist kein Objekt.
> Deswegen müßte man die Definition von Prädikat noch präzisieren.
Nein. Allgemein bedeutet der Begriff "Prädikat": eine Funktion, die
eine Frage mit Ja oder Nein beantwortet.
Für diverse STL-Funktionen braucht man ein Prädikat. Aus diversen
Gründen (im Gegensatz zu Funktionen können Objekte Informationen
speichern) ist es sinnvoll, das Prädikat in Form eines Funktions-
Objekts zugänglich zu machen. Der einzige Sinn dieses Funktionsobjektes
ist:
- Informationen speichern zu können, wenndas nötig ist
- den ()-Operator zu überladen, damit der Functor wie eine
Funktionbenutzt werden kann.
> Vielleicht:
> Ein Prädikat ist ein Objekt, das eine Funktion (oder einen
> Operator) mit dem Datentyp bool besitzt?
Wie gesagt, ein "Prädikat" ist ein Konzept. Und zwar sagt dieses
Konzept "ein Prädikat beantwortet eine Frage mit Ja oder Nein".
Im übrigen haben Funktionen keinen Datentyp. Sie haben höchstens einen
Datentyp für ihren Rückgabewert.
> 2) Diese Definition eines Funktionsobjekts kannte ich bis jetzt
> nicht. Ist diese MS-spezifisch?
Nein, das ist STL-spezifisch. Ich verwende sehrwenig MS-spezifisches
:-)
> In der Hilfe zu sort steht auch nirgends, daß in sort intern der
> Operator () benutzt wird. Woher soll man das wissen?
Aus einem guten Buch über die STL :-)
> In meinen Büchern steht das nirgends. Oder steht das nur in einem
> Buch über die Standard Library?
"Nur"? Keine Ahnung, ich kenne nicht alle Bücher. Auch dein Buch kenne
ich nicht.
> Gibt es dazu genauere Informationen in der Online-Hilfe zu MS?
Kuckstu hier:
<http://tinyurl.com/4snvu> [1]
>> Wenn du also
>> std::vector<K>
>> benutzt hast, muß für std::vector<K>::iterator
>> u.a. der ++-Operator definiert sein. Sonst ist es halt kein
>> Iterator.
>>
> 3)Man muß also in der Klasse K den ++-Operator definieren.
> Ist das korrekt?
Nein. Ich schrieb, daß man das in
std::vector<K>::iterator
tun muß. Der Iterator muß den ++-Operator haben, nicht die Klasse
selbst, die im vector organisiert ist.
> 5) Im folgenden Demo-Programm wollte ich überprüfen, ob ich das,
> was ihr gechrieben habt, auch verstanden habe. Deswegen ("Die
> Wahrheit ist konkret") habe ich ein einfaches Demo-Programm
> geschrieben, das funktioniert. Was meint ihr dazu?
>
> #include "stdafx.h"
> #include <stdio.h>
> #include <iostream.h>
> #include <iomanip.h>
Du solltest C++-header verwenden. Die haben kein .h am Ende.
> template <class T, class MyPred> void mysort(T* e1, T* e2, MyPred
> p){
> T temp;
> // p(e1,e2) äquivalent zu p.operator()(e1,e2)
> // if(!p(e1,e2)){ funktioniert auch
> if(!p.operator()(e1,e2)){
> temp= *e1;
> *e1 = *e2;
> *e2 = temp;
> }
> }
1. Ein Sortierungsalgorithmus sollte KEINE Pointer verwenden, sondern
Iteratoren.
2. Man sollte die Iteratoren dann auch für ihren Zweck benutzen: um
über einen Bereich zu iterieren, also irgend etwas wiederholt zu tun.
Dafür brauchtman schleifen. Deine Sortierungsfunktion hat keine
Schleife, sie kann also höchstens dann mal sortieren, wenn die zu
sortierende Sequenz genau zwei Elemente hat...
[1] <http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/vcstdlib/html/vclrfalgorithmsort.asp>
-- ( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr ) "Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl. Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer, 02.10.2003
- Next message: Jochen Kalmbach: "Re: alternative Entwicklungsumgebung"
- Previous message: anonymous_at_discussions.microsoft.com: "Re: Zugriff auf Access-Datenbank über ODBC"
- In reply to: Ernst Baumann: "Re: Einfache Frage zu STD::SORT"
- Next in thread: Ernst Baumann: "Re: Einfache Frage zu STD::SORT"
- Reply: Ernst Baumann: "Re: Einfache Frage zu STD::SORT"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|