[C++] std::map

Online-Skater

Erfahrenes Mitglied
Hallo Tutorianer,

Ich arbeite zum ersten mal mit der std::map und habe eine Frage bzgl. map::find()
Get iterator to element

Searches the container for an element with a value of x and returns an iterator to it if found, otherwise it returns an iterator to map::end (the element past the end of the container).

Das bedeutet doch wenn ich mein Element anhand des Schlüssels nicht in der Map finde gibt er mir die letzte Position der Map zurück, als wenn das das gesuchte Element wäre.
Beispiel Ich möchte ein Element löschen welches zufällig nicht in der Map ist, also unabsichtlich quasi.
C++:
std::map<uint32_t, Node> nodesMP;
// Code , einfügen usw
// aNodeId ist ein uint32_t Wert
nodesMP.erase(nodesMP.find(aNodeId));
Jetzt würde er also aufjedenfall ein Element löschen, entweder das gesuchte oder das letzte. Das doch irgendwie unpraktisch. Wie kann ich das verhindern ?

Genau das gleiche wenn ich ein Element aus der Map haben möchte.
Benutzt man den []-Operator wird sogar ein neues Element angelegt, also das ist dafür unbrauchbar. Also geht wieder nur map::find() mit der ich dann das gesuchte Element bekomme oder das letzte .... oder was ?

Wie soll man denn damit arbeiten ? Wenn ich abfrage ob es das letzte Element ist dann könnte es ja auch zufällig das richtige sein, laut Key.

mfg
 
Hallo,

wie im von dir aufgeführten Zitat steht, bedeutet "map::end" past-the-end also hinter dem letzten Element und nicht das letzte Element. Du solltest daher bei den entsprechenden Methoden immer erst auf "map::end" prüfen und nur im gegenteiligen Fall die jeweilige Aktion ausführen.

Gruß
MCoder
 
Ah ok sowas ähnliches hab ich mir schon gedacht aber konnte es mir nicht so recht vorstellen. Was würde denn passieren wenn man dieses map::end löscht ?

mfg
 
Alles klar. Hier noch ein Schnipsel für die Allgemeinheit ;-)

C++:
// get a node from graph
Node* Graph::getNode(uint32_t aNodeId, NODE_TYPE aType)
{
    std::map<uint32_t, Node>::iterator it;
    switch(aType)
    {
        case MESHPOINT:
        {
            it = nodesMP.find(aNodeId);
            if (it != nodesMP.end())
            {
                return &it->second;
            }
        }
        case CLUSTERHEAD:
        {
            it = nodesCH.find(aNodeId);
            if (it != nodesCH.end())
            {
                return &it->second;
            }
        }
        case DOMAINHEAD:
        {
            it = nodesDH.find(aNodeId);
            if (it != nodesDH.end())
            {
                return &it->second;
            }
        }
        default: return 0; // This case can be
    }
}

mfg
 
Zurück