STL HASH_MAP - Chave de modificação
Pergunta
Eu tenho um mapa de 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;
Mais tarde, no código, tenho um local onde tenho que fazer loop no mapa e aplicar uma função a cada valor que encontro. Com base no resultado da função, também tenho que modificar a chave no iterador.
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();
}
Minha pergunta é: essa seria a maneira certa de modificar a chave, se for necessário? Tem algum efeito colateral ruim?
Solução
Você teria que remover o elemento do contêiner e adicione-o com a nova chave.
Nenhum dos contêineres associativos C ++ apoia a alteração da chave de uma maneira significativa (onde significativo significa que a alteração altera os resultados do hash em um contêiner de hash ou a compra em um contêiner ordenado).
Se você modificou a chave (contornando o sistema de correção const de alguma forma), obteria resultados imprevisíveis das pesquisas.
Outras dicas
Não apenas você não pode mudar a chave, pois é um const
membro de pair
, você não pode apagar ou inserir membros no hash_map
sem invalidar o iterador, i
, Você tem. Quando i
está invalidado, você não pode incrementá -lo para obter o próximo item do contêiner.
Pode haver (e provavelmente é) um algoritmo melhor, mas o que eu acho que você precisará fazer é armazenar cópias dos elementos (ou apenas as chaves) dos elementos que você deseja trocar as chaves em algum outro contêiner temporário na tua for
ciclo. Em seguida, caminhe o contêiner temportário e use as informações para:
- Obtenha o elemento para o qual deseja alterar a chave no original
hash_map
recipiente erase()
Esse elemento do contêiner originalinsert()
um novo elemento com a nova chave e valor original de volta aohash_map
Em seguida, você pode despejar o contêiner temporário.