Domanda

Sto cercando di inserire alcune coppie di valori in uno std :: map. Nel primo caso, viene visualizzato un puntatore alla mappa, dereferenziarlo e utilizzare l'operatore pedice per assegnare un valore. cioè

(*foo)[index] = bar;

coppie chiave Più tardi, quando cerco di iterare la raccolta, sto tornato / valore che contengono nullo per l'attributo value in tutti i casi tranne che per la prima voce (map.begin ()). La cosa strana è, se faccio l'inserimento tramite la funzione di inserimento della carta, tutto è bene, cioè:

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

Perché questo sarebbe? Non sono i due metodi funzionalmente equivalente? Ho incollato alcuni frammenti di codice reale minore per il contesto

...
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++;
    }

}

Sono tutti fuori di idee. Qualcuno ha un suggerimento per favore?

È stato utile?

Soluzione

Nel codice attuale si hanno:

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

Questa non assegnerà tmp nella mappa, ma sarà invece riferimento nella mappa creazione di un valore vuoto (vedi @Neil Butterworth) - avete == invece di =. Quello che vuoi è:

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

Altri suggerimenti

È necessario essere consapevoli che l 'operatore [] per std :: map inserirà un valore nella mappa se uno non esiste quando viene utilizzato in espressioni come questa:

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

Se il valore x non esiste, ne verrà creato e assegnato il valore creato dal costruttore di default i tipi di valore, o pari a zero per il built-in tipi. Questo non è quasi mai quello che si vuole, e si dovrebbe in generale evitare l'uso dell'operatore [] con le mappe.

Il vostro tipo di valore ha un operatore di assegnazione?

Date un'occhiata a questo riferimento . L'operatore [] restituisce un riferimento non const al valore. Se il vostro compito è sbagliato o funziona in modo inaspettato in qualche modo questo potrebbe essere la causa.

Il metodo insert invece assume un valore e lo mette nella mappa. L'operatore [] costruisce un oggetto con il costruttore di default, quindi ti permette di assegnare roba ad esso usando il suo operatore di assegnazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top