当将向量设置为一个值时,整个向量会被覆盖

When dereferencing a vector to set a value the entire vector gets overwritten

本文关键字:向量 覆盖 设置 一个      更新时间:2023-10-16

我正在声明一个向量和基本元素,这实际上意味着插槽在我的标题文件中打开:

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
  • 使用构造函数中的初始化列表。

摆脱指针,确保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,这是一个严重的名字。我也不确定您为什么要以这种方式构建您的向量。或在创建哈希地图时完全使用一个。在标准中,已经有很多用于将KeyValues与std::unordered_map这样的哈希存储的容器。总的来说,您的代码都闻起来。

您的问题可能是一个问题。