取消引用向量以设置值时,整个向量将被覆盖
When dereferencing a vector to set a value the entire vector gets overwritten
我正在声明一个向量和一个基本元素,这实际上意味着插槽在我的头文件中是打开的:
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;
}
这里有更多的逻辑来处理 table 中已经存在的值,但我认为它可能只会挤占重要的内容。当 (*(*hashTable)[hashVal]) = elt;
行被执行时,我的整个向量被 elt
覆盖,我想要的只是我提供的索引。另外发生了什么我真的无法理解,但我的 baseElt
也被这个值覆盖了。我确定这与我处理指针的方式有关 我是 c++ 的新手,因此非常感谢任何帮助。
- 不要使用指针。
- 不要使用
new
。
- 在构造函数中使用 initializer list。
去掉你的指针,确保 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。
我正在声明一个向量和一个基本元素,这实际上意味着插槽在我的头文件中是打开的:
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;
}
这里有更多的逻辑来处理 table 中已经存在的值,但我认为它可能只会挤占重要的内容。当 (*(*hashTable)[hashVal]) = elt;
行被执行时,我的整个向量被 elt
覆盖,我想要的只是我提供的索引。另外发生了什么我真的无法理解,但我的 baseElt
也被这个值覆盖了。我确定这与我处理指针的方式有关 我是 c++ 的新手,因此非常感谢任何帮助。
- 不要使用指针。
- 不要使用
new
。 - 在构造函数中使用 initializer list。
去掉你的指针,确保 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。