Frage zu deque



  • Ist es wichtig dass man bei deque und alle anderen Container mit iterator auf die Elemente zugreift?

    deque<int> deque;
    deque.push_back(5676);
    ...
    

    Bisher hab ich immer mit deque[i] in einer forschleife auf die Elemente zugegriffen, um von Vorne nach Ende oder andersrum auszulesen.

    Kann es sein dass es immer ein random-access ist, auch wenn's in einer for-schleife ist?

    Zweite Frage zu deque: wenn ich paar mal push_back und paar mal push_front mache, so wird anscheinend nicht mehr erkannt wo die Null ist (welches das erste Element war). Mir wäre das aber wichtig, welche die negativen und welche die positiven Elemente wären. Soll ich dafür 2 container erzeugen für jede eine Richtung, oder einfach nur ein Zähler, der zurückzählt welches Element die Null wäre?





  • xBlackKnightx schrieb:

    Ist es wichtig dass man bei deque und alle anderen Container mit iterator auf die Elemente zugreift?

    Nein, es kommt natürlich drauf an, was du benötigst. Mit Iteratoren bist du grundsätzlich flexibler, falls du die Datenstruktur einmal austauschen möchtest (z.B. gegen eine std::list ).

    xBlackKnightx schrieb:

    Kann es sein dass es immer ein random-access ist, auch wenn's in einer for-schleife ist?

    Wie ist das zu verstehen? Der Zugriff über operator[] ist per Definition ein Random Access; was soll eine Schleife damit zu tun haben?

    xBlackKnightx schrieb:

    Zweite Frage zu deque: wenn ich paar mal push_back und paar mal push_front mache, so wird anscheinend nicht mehr erkannt wo die Null ist (welches das erste Element war). Mir wäre das aber wichtig, welche die negativen und welche die positiven Elemente wären. Soll ich dafür 2 container erzeugen für jede eine Richtung, oder einfach nur ein Zähler, der zurückzählt welches Element die Null wäre?

    Das ist wieder abhängig von deinen genauen Ansprüchen. Musst du zum Beispiel oft alle Elemente durchiterieren oder Algorithmen auf den gesamten Container anwenden, wäre ein einzelner wohl besser geeignet. Aber nimm doch eine kleine Wrapper-Klasse, die dir die Arbeit abnimmt, besonders wenn du die die Vorgehensweise mit einem Container wählst. Sonst vergisst du bestimmt einmal, mitzuzählen.



  • Nexus schrieb:

    Wie ist das zu verstehen? Der Zugriff über operator[] ist per Definition ein Random Access; was soll eine Schleife damit zu tun haben?

    Ich hab glaub ich falsch verstanden was im Buch oder Dokumentation stand. Nur bei list geht der random access langsam. Ich dachte, wenn man auf ein Element zugreifen will, so muss man den gesamten container einmal durchlaufen. Und bei einer for-schleife dachte ich, müsste man für jeden Zugriff einmal ganz durchlaufen. Offensichtlich geht der Zugriff nur bei list deshalb langsam, weil man erst nach einem Element suchen muss? Bei insertion wird gar nicht berücksichtig wo die Elemente abgelegt werden, so verstehe ich das zumindest.

    Nexus schrieb:

    Das ist wieder abhängig von deinen genauen Ansprüchen. Musst du zum Beispiel oft alle Elemente durchiterieren oder Algorithmen auf den gesamten Container anwenden, wäre ein einzelner wohl besser geeignet. Aber nimm doch eine kleine Wrapper-Klasse, die dir die Arbeit abnimmt, besonders wenn du die die Vorgehensweise mit einem Container wählst. Sonst vergisst du bestimmt einmal, mitzuzählen.

    okay, klassen-wrapper darüber muss ich mich noch schlau machen.

    vielen dank!



  • xBlackKnightx schrieb:

    Nexus schrieb:

    Wie ist das zu verstehen? Der Zugriff über operator[] ist per Definition ein Random Access; was soll eine Schleife damit zu tun haben?

    Ich hab glaub ich falsch verstanden was im Buch oder Dokumentation stand. Nur bei list geht der random access langsam. Ich dachte, wenn man auf ein Element zugreifen will, so muss man den gesamten container einmal durchlaufen. Und bei einer for-schleife dachte ich, müsste man für jeden Zugriff einmal ganz durchlaufen. Offensichtlich geht der Zugriff nur bei list deshalb langsam, weil man erst nach einem Element suchen muss? Bei insertion wird gar nicht berücksichtig wo die Elemente abgelegt werden, so verstehe ich das zumindest.

    Nexus schrieb:

    Das ist wieder abhängig von deinen genauen Ansprüchen. Musst du zum Beispiel oft alle Elemente durchiterieren oder Algorithmen auf den gesamten Container anwenden, wäre ein einzelner wohl besser geeignet. Aber nimm doch eine kleine Wrapper-Klasse, die dir die Arbeit abnimmt, besonders wenn du die die Vorgehensweise mit einem Container wählst. Sonst vergisst du bestimmt einmal, mitzuzählen.

    okay, klassen-wrapper darüber muss ich mich noch schlau machen.

    vielen dank!

    list bietet keinen random access



  • std__list schrieb:

    list bietet keinen random access

    in c++ reference steht

    Lists are sequences of elements stored in a linked list. Compared to vectors, they allow fast insertions and deletions, but slower random access

    ?


  • Administrator

    Völliger Humbug. Eine std::list ist eine doppelt verkettete Liste. Die hat überhaupt gar keinen Random Access. Wenn du über einen Index zugreifen möchtest, dann musst du Schritt für Schritt durch die Elemente gehen und eine Variable hochzählen, bis du beim entsprechenden Index angekommen bist. Das hat nichts mit Random Access zu tun 😉

    Deshalb bekommt man bei std::list auch einen Bidirectional Iterator, wenn man begin oder end aufruft, und keinen Random Access Iterator.

    Übrigens, hier noch eine andere Referenz:
    http://www.cplusplus.com/reference/

    Gefällt mir persönlich besser, ist oft auch detailierter. Falls du jetzt lieber mal eine andere Referenz ausprobieren möchtest *g*

    Grüssli


Anmelden zum Antworten