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

时间:2018-02-23 06:09:43

标签: c++ c++11 pointers dereference

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

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 ++的指针有关,所以任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:4)

  • 不要使用指针。
  • 请勿使用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