stl reference in iterator wandeln



  • Hallo

    Ist es möglich eine reference in einen iterator zu wandeln? Wenn ja, wie?



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • sibilly schrieb:

    Ist es möglich eine reference in einen iterator zu wandeln? Wenn ja, wie?

    Die Standardcontainer bieten so ein Feature nicht direkt an. Aber je nach Container, könnte man sich da etwas überlegen. Beispielsweise garantiert ein std::vector, dass die Elemente alle hintereinander im Speicher liegen. Dann könnte man es so machen:

    std::vector<int> v = ...;
    int& ref = v[3];
    std::vector<int>::iterator i = v.begin()+(&ref-&*v.begin());
    

    Das geht in konstanter Zeit.

    Bei einer std::deque geht das nicht mehr. Da müsstest Du std::find_if mit einem Prädikat benutzen, welches die Adressen der Objekte vergleicht. Im schlimmsten Fall, durchläufst Du dann die komplette Sequenz.

    Bei den assoziativen Containern kannst Du einfach wieder nach dem Schlüssel suchen und bekommt einen Iterator. Das kostet amortisiert O(log n) Zeit für einen Container, der n Elemente speichert.



  • Ok
    Aber das wäre ja dann einfacher:

    std::vector<int> v = ...;
    std::vector<int>::iterator i = v.begin() + pos - 1;
    

    Oder?



  • sibilly schrieb:

    Ok
    Aber das wäre ja dann einfacher:

    std::vector<int> v = ...;
    std::vector<int>::iterator i = v.begin() + pos - 1;
    

    Oder?

    Wie kommst du auf pos?



  • pos wäre die Stelle von der ich den Wert will also um das Beispiel von krümelkacker aufzugreifen:

    int& ref = v[3];
    

    wäre dann pos = 3



  • Wenn du eh die Position hast bräuchtest du die Referenz doch garnicht (typischer Fall von "frage WAS du erreichen willst, nicht WIE du es erreichen willst" - siehe Link in meiner Signatur)
    Was du erreichen willst geht am Einfachsten und Allgemeinsten wie folgt:

    //Container_t sei der Typ des Containers, cont der Container selber
    Container_t::iterator iter = cont.begin(); //oder const_iterator, wenn du das Ziel nicht verändern willst
    std::advance(iter, pos);
    

    std::advance verwendet für Randomaccess-Iteratoren (vector, deque, tr1::array) einfach iter += pos , und für alle anderen Iteratoren einfach pos-mal iter++ . Das -1 in deinem Code oben ist übrigens murks, überleg mal was bei pos=0 pasiert 😉


Anmelden zum Antworten