Frage

Ich versuche, einige Wert-Paare in ein std :: map einzufügen. Im ersten Fall, erhalte ich einen Zeiger auf die Karte, dereferenzieren und verwenden Sie den Index-Operator einen Wert zuzuweisen. d

(*foo)[index] = bar;

Später, wenn ich versuche, über die Sammlung iterieren, ich bin zurück Schlüssel / Wert-Paare, die mit Ausnahme der ersten (map.begin ()) Artikel in allen Fällen für das Wertattribut null enthalten. Die seltsame Sache ist, wenn ich das Einfügen über die Karte der Insert-Funktion zu tun, alles ist gut, das heißt:

foo->insert(std::pair<KeyType,ValueType>(myKey, myValue));

Warum sollte das sein? Sind die beiden Methoden funktional äquivalent? Ich habe für den Kontext einige Schnipsel eigentlichen Code unten eingefügt

...
typedef std::map<int, SCNode*> SCNodeMap;
...


void StemAndCycle::getCycleNodes(SCNodeMap* cycleNodes)
{
    (*cycleNodes)[root->getId()] = root;

    SCNode* tmp = root->getSucc();
    while(tmp->getId() != root->getId())
    {
        // (*cycleNodes)[tmp->getId()] == tmp; // crashes (in loop below)
        cycleNodes->insert(std::pair<int, SCNode*>(tmp->getId(), tmp));//OK
        std::pair<int, SCNode*> it = *(cycleNodes->find(tmp->getId()));
        tmp = tmp->getSucc();
    }

    // debugging; print ids of all the SCNode objects in the collection
    std::map<int, SCNode*>::iterator it = cycleNodes->begin();
    while(it != cycleNodes->end())
    {
        std::pair<int, SCNode*> p = (*it);
        SCNode* tmp = (*it).second; // null except for it = cycleNodes->begin()
        std::cout << "tmp node id: "<<tmp->getId()<<std::endl; 
        it++;
    }

}

Ich bin ganz aus Ideen. Hat jemand einen Vorschlag bitte?

War es hilfreich?

Lösung

In Ihrem aktuellen Code, den Sie haben:

(*cycleNodes)[tmp->getId()] == tmp;

Dies wird nicht vergeben tmp in die Karte, sondern stattdessen in die Karte Referenz einen leeren Wert zu schaffen (siehe @Neil Butterworth) - Sie haben statt = ==. Was Sie wollen, ist:

(*cycleNodes)[tmp->getId()] = tmp;

Andere Tipps

Sie sollten sich bewusst sein, dass operator [] für std :: map einen Wert in die Karte einfügen, wenn man nicht existiert, wenn in Ausdrücken wie folgt verwendet:

if ( amap[x] == 42 ) {
   ...
}

Wenn der Wert x nicht existiert, wird eine erstellt und den Wert durch den Wert Typen Standardkonstruktors erstellt zugeordnet werden, oder Null für die eingebauten Typen. Dies ist so gut wie nie, was Sie wollen, und Sie sollen die Verwendung von operator [] mit Karten im Allgemeinen vermeiden.

Gibt es in Ihrem Werttyp einen Zuweisungsoperator hat?

Hier finden Sie aktuelle dieser Referenz . Der Operator [] gibt eine nicht konstante Referenz auf den Wert. Wenn Ihre Zuordnung falsch ist oder funktioniert irgendwie auf unerwartete Weise könnte dies die Ursache sein.

Der Einsatz Verfahren auf der anderen Seite nimmt einen Wert und stopft es in die Karte. Der Operator [] konstruiert ein Objekt mit dem Standard-Konstruktor, dann lassen Sie sich Sachen zuweisen verwenden es Zuweisungsoperator.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top