Einen Iterator eines "set" als key einer "map"?



  • Hallo, ist es sinvoll einen Iterator eines "set" als key einer "map" zu definieren?

    Ich habe mehrere set's deren Daten ich mit verschiedenen map's und multimap's "verlinken" will. Damit will ich die Daten nur einmal im Speicher halten. Nur bin ich mir unsicher ob die Iteratoren auch Veränderungen an den Containern mitmachen?

    Was sagt ihr und wie umgeht ihr Dupletten?

    Gruß, Goran


  • Mod

    Iteratoren in assoziative Container sind stabil, ebenso wie Referenzen und Zeiger auf Elemente und werden nur ungültig, wenn das jeweilige Element gelöscht wird. Trotzdem ist es regelmäßig nicht richtig, für zu speichernde Verweise auf solche Elemente Iteratoren statt Zeiger zu verwenden. Ein Iterator ist mehr als ein Zeiger auf ein Element, denn zusätzlich zum Verweis auf das Datenelement enthält er Informationen darüber, in was für einer Art Sequenz die Daten gespeichert sind, als auch die Möglichkeit, durch diese Datensequenz zu iteratieren. Sofern du von dieser Information in deinen maps nicht abhängig bist - gemäß deiner Beschreibung ist das der Fall - solltest du diese Sequenzabhängigkeit nicht künstlich hineinbringen.
    Im Übrigen ist für dein Problem möglicherweise ein Ansatz in der Art von Multi Index Container angebracht, das lässt sich der Problembeschreibung nicht sicher entnehmen.



  • Du hast ganz recht. Alle deine Vermutungen waren richtig.

    Ich habe jetzt als key den Iterator dereferenziert. D.h.: const T* xyz = &(*itr); Ist das i.O.? Die Boost-Geschichte sehe ich mir gleich an.

    Goran



  • Der Schlüssel einer std::map muß mit dem Operator "<" vergleichbar sein, wenn man kein anderes Prädikat übergibt. Ein Iterator auf ein std::set erfüllt diese Anforderung nicht. Daher ist es nicht erlaubt.


Anmelden zum Antworten