Pregunta

Tengo un mapa hash definido como

class KeyType {
    int key;
    mutable bool flag;
    KeyType(int key) : key(key), flag(false) {}
    void setFlag() const { flag = true; }
};

struct KeyType_hasher {
    size_t operator()(const KeyType& s) const {
        return static_cast<size_t> key;
    }
};

struct KeyType_equal {
    size_t operator()(const KeyType& s1, const KeyType& s2) const {
        return s1.key == s2.key;
    }
};

typedef hash_map<KeyType , ValueType, KeyType_hasher, KeyType_equal > KeyValueMap;

Más tarde en el código que tengo un lugar donde tengo que bucle aunque el mapa y aplicar una función a cada valor encuentro. Con base en el resultado de la función, tengo que modificar la clave en el iterador también.

KeyValueMap theMap;
// theMap[key1] = value1;
// theMap[key2] = value2;
// theMap[key3] = value3;
for(KeyValueMap::iterator i = theMap.begin(); i != theMap.end(); ++i) {
    if(true == ValueFunction(i->second))
        i->first.setFlag();
}

Mi pregunta es, ¿sería la manera correcta de modificar la clave, si tengo que hacerlo? ¿Tiene efectos secundarios mal?

¿Fue útil?

Solución

Usted tendría que retirar el elemento del recipiente y volver a añadir que con la nueva clave.

Ninguno de los contenedores asociativos el C ++ soporta el cambio de la clave de una manera significativa (donde significativo significa que el cambio altera los resultados del hash en un recipiente hash o la comparrsion en un recipiente ordenado).

Si lo hizo modificar la clave (por eludir el sistema de corrección const de alguna manera) se obtendría resultados impredecibles de las búsquedas.

Otros consejos

No sólo no se puede cambiar la clave, ya que es un miembro de la const pair, no se puede borrar o insertar miembros en la hash_map sin invalidar el iterador, i, que tiene. Cuando se invalida i, no se puede incrementar para obtener el siguiente elemento del contenedor.

Puede haber (y probablemente es) un algoritmo mejor, pero lo que yo creo que lo que necesita hacer es almacenar copias de los elementos (o sólo las teclas) de los elementos que desea tener las claves para cambiar de alguna otro contenedor temporal en su bucle for. Luego a pie del contenedor temportary y utilizar la información en él a:

  • obtener el elemento que desea cambiar la clave en el envase original, hash_map
  • erase() ese elemento del envase original
  • insert() un nuevo elemento con el nuevo valor de la clave y original de nuevo en el hash_map

A continuación, se puede volcar el contenedor temporal.

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