При разыменовании вектора для установки значения весь вектор перезаписывается
Я объявляю вектор и базовый элемент, что по сути означает, что слот открыт в моем заголовочном файле:
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 ответ
- Не используйте указатели.
- Не использовать
new
, - Используйте список инициализаторов в вашем конструкторе.
Избавьтесь от своих указателей и убедитесь, 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.