При разыменовании вектора для установки значения весь вектор перезаписывается

Я объявляю вектор и базовый элемент, что по сути означает, что слот открыт в моем заголовочном файле:

template <typename K, typename V>
class Map_Hash
{
private:
    vector<KeyValue<K,V>*> *hashTable;
    KeyValue<K,V> *baseElt;
}

Я создаю их в своем конструкторе:

template <typename K, typename V>
Map_Hash<K,V>::Map_Hash(int M, K baseKey, V baseValue)
{
    this->M = M;
    baseElt = new KeyValue<K,V>(baseKey, baseValue);
    hashTable = new vector<KeyValue<K,V>*>(M, baseElt);
}

Теперь, когда я пытаюсь написать им новые значения, я делаю это так:

template <typename K, typename V>
void Map_Hash<K,V>::add(K key)
{
    KeyValue<K,V> elt(key);
    int hashVal = getHashVal(elt);
    (*(*hashTable)[hashVal]) = elt;
}

Здесь есть немного больше логики, чтобы иметь дело с ценностью, уже имеющейся в таблице, но я думаю, что это может просто вытеснить то, что важно. Когда линия (*(*hashTable)[hashVal]) = elt; выполняется весь мой вектор перезаписывается с elt и все, что я хочу, это просто индекс, который я предоставил. Кроме того, что происходит, что я действительно не могу понять, но мой baseElt также перезаписывается с этим значением. Я уверен, что это как-то связано с тем, как я обращаюсь с указателями, которые я новичок в C++, поэтому любая помощь будет очень цениться.

1 ответ

Решение

Избавьтесь от своих указателей и убедитесь, M а также baseElt раньше hashTable:

template <typename K, typename V>
class Map_Hash
{
private:
    int M;
    KeyValue<K,V> baseElt;
    vector<KeyValue<K,V>> hashTable;
}

Используйте список инициализаторов в вашем конструкторе:

template <typename K, typename V>
Map_Hash<K,V>::Map_Hash(int M, K baseKey, V baseValue) :
    M{ M },
    baseElt{ baseKey, baseValue },
    hashTable{ M, baseElt }
{
}

Затем просто добавьте новое значение в ваш вектор:

template <typename K, typename V>
void Map_Hash<K,V>::add(K key)
{
    KeyValue<K,V> elt{ key };
    int hashVal = getHashVal(elt);
    hashTable[hashVal] = elt;  // This will fail if hashVal is too big for the size of your vector!
}

Вы можете переименовать Mэто серьезно плохое имя. Я также не уверен, почему вы хотите построить свой вектор таким образом. Или используйте один при создании хэш-карты. Уже есть много контейнеров для хранения значений ключей с хэшированием std::unordered_map в стандарте. В целом ваш код пахнет.

Ваш вопрос может быть проблемой XY.

Другие вопросы по тегам