Weird error mientras se inserta en C ++ std :: mapa
-
16-09-2019 - |
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?
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.