2010-10-07 30 views
7

DadaCómo modificar los valores clave en std :: mapa del contenedor

std::map<int,std::string> myMap; 
fillMyMapWithStuff(myMap); 

// modify key values - I need to add a constant value to each key 
for (std::map<int,std::string>::iterator mi=myMap.begin(); mi != myMap.end(); ++mi) 
{ 
    // ... 
} 

¿Cuál es una buena manera de aplicar un poco de volver a clasificar? ¿Debo eliminar la entrada anterior y agregar una nueva con la nueva clave y el valor anterior?

Respuesta

8

Parece que es mejor construir un nuevo mapa y cambiarlo después. Solo tendrá n operaciones de inserción en lugar de n eliminaciones y n inserciones.

+0

+1, en este caso, cuando se reconstruye todo el mapa, es mejor que incluso borrar + insertar con sugerencia. – Cubbi

+0

Para ser justos, su n inserta operaciones + 1 operación de intercambio. – Justicle

+0

@Justin: Pero un intercambio debe tomar una cantidad de tiempo sin sentido. –

3

Sí, debes hacerlo. La clave es const mientras está en el mapa.

5

Sí, debe eliminar la entrada anterior y agregar una nueva con la nueva. Las llaves no son modificables.

Si estaba modificando solo uno o algunos elementos, puede hacerlo de manera eficiente haciendo alusión a map::insert con la posición del nuevo elemento. Dado que sus nuevas claves están seguras de ubicarse en algún lugar después de las claves antiguas, puede indicar con el iterador que apunta al elemento anterior. Sin embargo, debe tener cuidado de no volver a evaluar las claves recién insertadas (por ejemplo, iterar de extremo a extremo) y, en caso de modificar todo el mapa, es más eficiente crear una nueva.

2

Creo que deberás construir un nuevo mapa. Si elimina y agrega nuevas claves dentro del ciclo, podría destruir la integridad de iterar sobre el conjunto de claves antiguas, y no tocar las teclas recién insertadas. (A menos que sepa cómo se distribuyen sus llaves y coloque su propia lógica allí).

std::map<int,std::string> myMap; 
fillMyMapWithStuff(myMap); 

std::map<int,std::string> newMap; 

// modify key values - I need to add a constant value to each key 
for (std::map<int,std::string>::iterator mi=myMap.begin(); mi != myMap.end(); ++mi) 
{ 
    newMap[mi->first] = mi->second; 
} 
2

Hay una opción más. Si esta operación es una característica importante de su colección, y el rendimiento es importante, puede evitar copiar el mapa por completo. Puede crear una clase que sobrecargue operator[], así como otros accesos y mutadores, y agregar el desplazamiento actual del valor de la clave.

Cuestiones relacionadas