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?

Foi útil?

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 original
  • insert() um novo elemento com a nova chave e valor original de volta ao hash_map

Em seguida, você pode despejar o contêiner temporário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top