Pregunta

Estoy tratando de insertar algunos pares de valores en un std :: mapa. En el primer caso, recibo un puntero al mapa, eliminar la referencia y utilizar el operador subíndice para asignar un valor. es decir

(*foo)[index] = bar;

Los pares clave Más tarde, cuando trato de iterar sobre la colección, me volví / valor que contienen nulo para el atributo de valor en todos los casos, excepto para el primer artículo (map.begin ()). Lo extraño es, si hago la inserción a través de la función de inserción del mapa, todo está bien, es decir:

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

¿Por qué sería esto? No son los dos métodos funcionalmente equivalente? He pegado algunos fragmentos de código real por debajo de contexto

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

}

Me he quedado sin ideas. ¿Alguien tiene una sugerencia por favor?

¿Fue útil?

Solución

En el código real que tiene:

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

Esto no asignará tmp en el mapa, sino que en lugar de referencia en el mapa la creación de un valor vacío (ver @Neil Butterworth) - se han == en lugar de =. Lo que queremos es:

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

Otros consejos

Debe tener en cuenta que el operador [] para std :: mapa insertará un valor en el mapa si uno no existe cuando se usa en expresiones como esta:

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

Si no existe el valor de x, se creará uno y asigna el valor creado por el constructor predeterminado tipos de valor, o cero para el incorporado en los tipos. Esto casi nunca es lo que quiere, y debe evitar generalmente el uso de operador [] con los mapas.

¿Su tipo de valor tiene un operador de asignación?

Tome un vistazo a esta referencia . El operador [] devuelve una referencia no const al valor. Si su asignación es incorrecta o de alguna manera funciona de una manera inesperada esto podría ser la causa.

El método de inserción en la otra parte toma un valor y lo mete en el mapa. El operador [] construye un objeto con el constructor por defecto, entonces vamos a asignar cosas a ella utilizando su operador de asignación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top