[ERLEDIGT] iterator und const iterator



  • ... schrieb:

    ....

    Dann wird aber beim Betreten der Funktion doch unnötig kopiert?



  • darkfate schrieb:

    krümelkacker schrieb:

    Warum......akzeptierst Du in Zeile 4 search_id als Referenz?

    Weil ich sie nirgendwo manipuliere. Ist das nicht ok?

    Was ist das denn für eine Logik?

    darkfate schrieb:

    krümelkacker schrieb:

    ...glaubst Du, man könne einen const_iterator in einen iterator konvertieren?

    Bisher dachte ich es. Anscheinend nicht. Den Grund wüsste ich gerne, vielleicht hat jemand dafür eine gute Begründung. Link?

    Wenn das ginge, würde die Unterscheidung zwischen iterator und const_iterator keinen Sinn machen. Dann kann ja jeder daher kommen und einen const_iterator in einen iterator verwandeln und böse Dinge anstellen. Eine interessantere Frage wäre: Warum akzeptiert die erase-Methode keinen const_iterator? Antwort: An so etwas hat man wahrscheinlich nicht gedacht beim Design.

    kk



  • darkfate schrieb:

    ... schrieb:

    ....

    Dann wird aber beim Betreten der Funktion doch unnötig kopiert?

    Jein. Im Fall einer extrem großen Klasse, etc. wäre das sicher ein Punkt, wo man drauf achten kann. Oft wirst du daher auch im Forum const std::string& str als Parameter sehen. Bei einem int ist das aber vollkommen überflüssig. Der Datentyp ist so klein. Ich bin mir nicht sicher, aber eventuell macht die Referenz es in dem Fall sogar noch langsamer 😃 Also merke dir: Bei den "eingebauten" Datentypen macht das keinen Sinn und ist überflüssig.



  • Das ist ein int , der kostet so gut wie gar nichts beim Kopieren. Außerdem verbraucht die Referenz auch Speicher und CPU-Zeit, vielleicht sogar noch mehr.



  • krümelkacker schrieb:

    darkfate schrieb:

    krümelkacker schrieb:

    Warum......akzeptierst Du in Zeile 4 search_id als Referenz?

    Weil ich sie nirgendwo manipuliere. Ist das nicht ok?

    Was ist das denn für eine Logik?

    darkfate schrieb:

    krümelkacker schrieb:

    ...glaubst Du, man könne einen const_iterator in einen iterator konvertieren?

    Bisher dachte ich es. Anscheinend nicht. Den Grund wüsste ich gerne, vielleicht hat jemand dafür eine gute Begründung. Link?

    Wenn das ginge, würde die Unterscheidung zwischen iterator und const_iterator keinen Sinn machen. Dann kann ja jeder daher kommen und einen const_iterator in einen iterator verwandeln und böse Dinge anstellen. Eine interessantere Frage wäre: Warum akzeptiert die erase-Methode keinen const_iterator? Antwort: An so etwas hat man wahrscheinlich nicht gedacht beim Design.

    kk

    Wird beim Aufruf von erase nicht der Iterator ungültig? Eventuell wird dieser überschrieben und auf end gesetzt. Ich traue den Entwicklern durchaus einiges zu und schließe daher ein Designfehler aus. 🤡



  • darkfate schrieb:

    ... schrieb:

    ....

    Dann wird aber beim Betreten der Funktion doch unnötig kopiert?

    Wir sprechen hier von einem int! Und überhaupt, wenn man bei einem nicht-trivialen benutzerdefinierten Typen das Kopieren sparen will, benutzt man Referenzen auf const:

    double vector_sum(vector<double> const& rac); // ref-auf-const
    


  • Ok die Referenz wird entfernt. Demokratisch..



  • Was passiert eigentlich mit der find() funktion wenn ich mehrere Werte habe? Bleibt sie beim ersten Wert stehen?



  • darkfate schrieb:

    Was passiert eigentlich mit der find() funktion wenn ich mehrere Werte habe? Bleibt sie beim ersten Wert stehen?

    Einem Key ist nur 1 Wert zugeordnet.



  • TyRoXx schrieb:

    darkfate schrieb:

    Was passiert eigentlich mit der find() funktion wenn ich mehrere Werte habe? Bleibt sie beim ersten Wert stehen?

    Einem Key ist nur 1 Wert zugeordnet.

    Danke an alle Helfenden 🙂



  • ... schrieb:

    Man kann das const durchaus wegcasten. [...] Fakt ist, dass krümelkacker unrecht hat.

    TestMap::iterator *nonConstIt = reinterpret_cast<TestMap::iterator *>(&constIt);
    

    Fakt ist, dass das nach ISO C++ Abschnitt 3.10 Absatz 15 undefiniertes Verhalten hervorruft.


Anmelden zum Antworten