我正在声明一个向量和基本元素,这实际上意味着插槽在我的标题文件中打开:
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 的指针有关,因此非常感谢任何帮助。
- 不要使用指针。
- 不要使用
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
,这是一个严重的名字。我也不确定您为什么要以这种方式构建您的向量。或在创建哈希地图时完全使用一个。在标准中,已经有很多用于将KeyValues与std::unordered_map
这样的哈希存储的容器。总的来说,您的代码都闻起来。
您的问题可能是一个问题。