【问题标题】:Rehashing a hash table comprised of a vector of lists C++重新散列由列表向量组成的哈希表 C++
【发布时间】:2016-01-23 19:45:03
【问题描述】:

所以我实现了一个存储指针的哈希表。我将它实现为vectorlists。沿着std::vector<std::list<Sequence*> > hashTable; 的路线。我已经实现了一切,它工作正常。当我尝试重新散列哈希表时,我唯一的问题出现了。哈希表使用单独的链接来解决冲突,因此我的列表向量。

使用调试器,我发现我的 rehash 循环挂在 while 循环上并导致无限循环。它不断地从我的旧向量的第一个索引中读取。我是新手,我不确定重新散列这张表的正确方法。我试图研究并发现对这种哈希表实现的引用并不多,更不用说重新哈希表了。这是我的实现。

void HashTable::rehash(int oldSize){
    int tempSize = 2 * oldSize;
    int newSize = HashTable::findPrime(tempSize);
    std::vector<std::list< Sequence*> > newHashTable;
    newHashTable.resize(newSize);
    tableSize = newSize;
    for(int i = 0; i < oldSize; i++){
        auto iter = hashTable[i].begin();
        while(iter != hashTable[i].end()){
            if((*iter) != nullptr){
                std::string tempString = (*iter)->getKey();
                int hashIndex = hashFunction(tempString);
                newHashTable[hashIndex].push_front(*iter);
            }
        }
    }
    hashTable = newHashTable;
}

我觉得这是一个简单的错误,我只是没有看到它。还是我完全走错了路?

【问题讨论】:

  • 有理由不使用std::unordered_map吗?
  • @m.s.是的,这是一个任务。我不允许使用std::unordered_map

标签: c++ c++11 vector stl hashtable


【解决方案1】:

您在 while 循环结束之前缺少一个 ++iter ,因此它会移动到列表中的下一个。

我通常会自己使用 for 循环,因为它使我不太可能忘记递增迭代器。比如:

for(auto iter = hashTable[i].begin(); iter != hashTable[i].end(): ++iter)
{
     // ... code using iterator ...
}

【讨论】:

    【解决方案2】:

    您似乎没有更新iter,这就是为什么iter 永远不会变成hashtable[i].end(),除非它以那个值开头。

    【讨论】:

    • 谢谢。这解决了问题。我不明白我怎么没看到。虽然,我已经盯着代码看了好几个小时了。
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2021-03-11
    • 2016-01-29
    • 2012-02-28
    相关资源
    最近更新 更多