取消引用向量以设置值时,整个向量将被覆盖

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

去掉你的指针,确保 MbaseElthashTable:

之前
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