【问题标题】:When dereferencing a vector to set a value the entire vector gets overwritten取消引用向量以设置值时,整个向量将被覆盖
【发布时间】:2018-02-23 06:09:42
【问题描述】:

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

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++ 新手的指针有关,因此非常感谢任何帮助。

【问题讨论】:

  • 您不需要指针。摆脱他们。
  • 由于这个声明hashTable = new vector&lt;KeyValue&lt;K,V&gt;*&gt;(M, baseElt);,所有的向量元素都是指针,更具体地说是相同的指针,即baseElt。因此,当您为向量有效索引处的任何元素赋值时,所有向量元素(指针)都将指向相同的值。
  • @sameerkn 考虑将其发布为答案,因为您的评论几乎是答案......
  • 停止无意义地使用指针。它使一切变得复杂。

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


【解决方案1】:
  • 不要使用指针。
  • 不要使用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。

【讨论】:

  • 具体来说,std::unordered_map::unordered_map(std::size_t) 用指定数量的桶初始化哈希映射
  • @max Vollmer 谢谢你的回答。我一定会改变这一点。我不知道如何更好地做到这一点,您的解决方案非常优雅。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多