我声明了一个向量和一个基本元素,这实际上意味着我的头文件中的插槽是打开的:
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 ++的指针有关,所以任何帮助都会非常感激。
答案 0 :(得分:4)
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
的散列值的哈希值。总而言之code smells。
您的问题可能是XY Problem。