Maps: value einzigartig?



  • hallo,

    folgendes Problem: ich habe eine map (std::map<int, meinStruct *> meineMap), wobei der Key ein Int ist und der Value ein eigenes Struct, das ganze schaut vereinfacht in etwa so aus:

    typedef struct {
      meinObject *meinObjectPtr;
      string filename;
    } meinStruct;
    
    std::map<int, meinStruct *> meineMap;
    

    jetzt soll allerdings in meineMap nicht nur der Key (int) einzigartig sein sondern auch ein Teil vom Value der Map (*meinObjectPtr). Will ich also in die map einen Wert speichern mit einem zwar neuen Key den es noch nicht gibt aber mit einem schon eingetragenen *meinObjectPtr dann will ich den alten Wert samt Key mit den neuen Wert überschreiben.

    Gibt es dafür geeignete STL Container oder geht das sowieso überhaupt nicht und es muss komplett anders aufgebaut werden?



  • Warum verwendest du dann nicht gleich meinObjectPtr als Key?



  • Normalerweise verwendet eine std::map den operator<, um Keys zu vergleichen und die entsprechende Position im Suchbaum (gewöhnlich ein Rot-Schwarz-Baum) zu ermitteln. Du kannst eine Datenstruktur für den Key erstellen, und den kleiner-als-Operator implementieren, oder du kannst der map als dritten Template-Parameter einen Funktor-Typ übergeben, der zum Vergleich der Keys herangezogen wird.



  • Braunstein schrieb:

    Warum verwendest du dann nicht gleich meinObjectPtr als Key?

    weil da wo ich die map auslese ist der int-Wert der einzige Wert der mir dort bekannt ist. Nach dem suche ich in der map und gebe die Daten des Structs aus.


  • Mod

    Edit: nt



  • Du könntest ja mal was mit boost::multi_index versuchen.



  • da fällt mir auch noch ne frage zu map ein.

    ich würde gerne ne map machen, welche schon definierte schlüssel (Strings) hat.

    std::map<std::string,MYDATA> m_mCollection;
    
    m_mCollection["A"]= ...;
    m_mCollection["B"]= ...;
    m_mCollection["C"]= ...;
    m_mCollection["D"]= ...;
    

    nun will ich später die werte der Schlüssel A-D lesen und setzen.. wenn ich aber bspw. ein wert auf den schlüssel "E" setzeb will, soll das NICHT gehen! nur die erlaubten schlüssel a-D sind gültig... geht sowas? oder muss ich alle vorher schlüssel iterieren und pürfen ob schlüssel X ein gültiger ist?



  • Du musst prüfen, ob der Schlüssel schon drin ist. Dazu musst du aber nicht iterieren. Dafür gibt es std:🗺:find.



  • sehr gut danke^^;)


Anmelden zum Antworten