prüfen ob std::list element ein nachfolgendes bzw. davorliegens Element hat?



  • die methoden next() und prev() sind aber nicht "public" . bsuw. wie gereif ich auf next bzw. prev über den iterator drauf zu?


  • Mod

    Methoden? Ich meinte so etwas boost.utility



  • achso , und ohne boost?? naja die templates machen die geschichte auch mit inkrement und dekrement^^

    ich könnte die Zeiger _next, _prev des iterators verwenden, aller dings sind diese "protected".. wäre doch schön wenn ich auf diese zugreifen könnte


  • Mod

    BorisDieKlinge schrieb:

    achso , und ohne boost??

    Schreibst du sie dir selber. Das ist eine Frage, die ich erwartet habe... und nicht beantworten werde.

    BorisDieKlinge schrieb:

    naja die templates machen die geschichte auch mit inkrement und dekrement^^

    Du missverstehst mich. Es geht nicht um die Implementation, sondern um das, was du in dem Vergleich hinschreibst. Bei

    if((++it--)== LIST.end())
    

    muss ich 5 mal hinschauen, um herauszubekommen, was es tut - nur um dann festzustellen, dass es nicht funktioniert. Ein

    if(next(it)== LIST.end())
    

    ist - jedenfalls in meinen Augen - auf Anhieb verständlich und offensichtich korrekt.

    ich könnte die Zeiger _next, _prev des iterators verwenden, aller dings sind diese "protected".. wäre doch schön wenn ich auf diese zugreifen könnte

    Zeiger? Irgendwelche Member? Ich habe keine Ahnung, was du meinst.



  • _Next und _Prev sind member eines iterators aus std::list container.. über dich ich theoretisch driekt auf das davorliegende oder nachkommende element zugriefen könnte. Wäre perfomanter als die templates...! ich red deshalb von performante weil das mehre 1000 mal gemacht werden muss und schnell gehen muss...



  • BorisDieKlinge schrieb:

    Wäre perfomanter als die templates...!

    Hast Du das schon gemessen (mit Optimierungen natürlich)? Wenn nicht, behaupte ich das ist falsch, bis das Gegenteil bewiesen ist.


  • Mod

    BorisDieKlinge schrieb:

    _Next und _Prev sind member eines iterators aus std::list container..

    In deiner speziellen Implementation möglicherweise. Das hat allerdings nichts mit diesem Forum zu tun.

    über dich ich theoretisch driekt auf das davorliegende oder nachkommende element zugriefen könnte.

    Selbst wenn dem so ist, erscheint es mir unwahrscheinlich, dass du hier Performance gewinnst. Gerade ein list-Iterator wird kaum sinnvoll Informationen über Vorgänger und Nachfolger selbst speichern können - schließlich kann sich das ändern während der Iterator selbst gültig bleibt. Bei einer hinreichend schlanken Implementation ist eigentlich nicht zu erwarten, dass obige Lösung (mit next oder äquivalent) irgendwie schlechter als das theoretische Optimum ist.

    Wäre perfomanter als die templates...! ich red deshalb von performante weil das mehre 1000 mal gemacht werden muss und schnell gehen muss...

    Es geht also um Performance. Das ist eine ganz andere Frage als die, die ursprünglich gestellt wurde. Da wäre zu prüfen, ob list überhaupt der richtige Container für die Aufgabe ist - was nur im konkreten Fall beantwortet werden kann. Es wäre (aber nur als Beispiel) denkbar, dass ein view der Art vector<T*> besser geeignet ist.



  • ne das wurde schon ausdiskutiert.. ich muss std::list verwenden weil ich zu 99% der elemente in die Liste , und nicht ans ende oder anfang einfüge.

    ich nehm an ein

    it++;
    

    macht ungefähr sowas wie

    _Ptr->next= _Ptr;
    

    mit dem template mach ich so eine kopie, dann ne zuweisung auf das nächten iterator und wieder eine kopie zurück. Deswege wäre eine direktor zugriff auf "_Next" performanter..

    wenn du dir man den std::list iterator anschaust, und mal ein iterator im debug watch fenster anschaust, siehst du das jeder iterator ein _Next und _Prev Zeiger, welche aber protected sind.. aus gutem grund natürlich. Ich meinte nur da es schöne wäre wenn ich diese in meinen Fall benutzen könnte.



  • BorisDieKlinge schrieb:

    Deswege wäre eine direktor zugriff auf "_Next" performanter..

    Bis hierher ist das immernoch eine unbestätigte Behauptung.


  • Mod

    BorisDieKlinge schrieb:

    ich nehm an [...]mit dem template mach ich so eine kopie, dann ne zuweisung auf das nächten iterator und wieder eine kopie zurück.

    Nicht zu vergessen der Vergleich greift dann auf das Ergebnis der Zuweisung zu. Das ist einerseits alles richtig, andererseits (weil - bei next - der Iterator temporär ist und dessen Destruktor trivial ist (jedenfalls sein sollte) und das Objekt sonst nicht weiter verwendet wird, und die Abhängigkeiten zwischen Lese- und Schreibvorgängen sehr einfach sind) kann all das bis auf den ursprünglichen Zugriff auf ->next leicht eliminiert werden. Nicht so dagegen bei (++it)-- - hier müsste der Compiler erst herausfinden, dass der Vorgänger des Nachfolgers eines Elements das Element selber ist - ich habe große Zweifel, dass irgendein existierender Compiler dazu in der Lage ist.

    Deswege wäre eine direktor zugriff auf "_Next" performanter..

    Vielleicht. Aber die Diskussion über die Performance des Unmöglichen/Verbotenen/was-auch-immer führt nicht weiter.



  • BorisDieKlinge schrieb:

    Deswege wäre eine direktor zugriff auf "_Next" performanter..

    Das ist kein Programmcode, das ist einfach nur Mist.

    Es gibt ein definiertes Interfaces von std::list und das liefert Dir keinerlei Information darüber wie was intern implementiert ist, und das ist auch gut so.
    Lerne einfach mal, daß es Interfaces gibt, die Kontrakte definieren und somit auch einzuhalten sind. Pfusch kann jeder zusammenschludern.


Anmelden zum Antworten