用C++实现哈希表的大小调整

问题描述 投票:0回答:1

我在c++中实现resize或expandcapacity函数时遇到了麻烦。这是我的resize(expandCapacity)函数。

    template <typename K, typename V> void HashTable<K, V>::expandCapacity() {
    LinearDictionary<K,V>* temp = this->hashTable;
    this->capacity *= 2;
    this->hashTable = new LinearDictionary<K,V>[this->capacity];
    for(int i = 0; i < capacity; i++){
      vector<pair<K,V>> items = temp[i].getItems();
      for(int j = 0;j < temp[i].getSize(); i++){
        K key = items[j].first;
        V value = items[j].second;
        int bucket = hash(key, capacity);
        this->hashTable[bucket].insert(key, value);
      }
    }
    delete temp;
}

这里是我的插入函数

    template <typename K, typename V> void HashTable<K, V>::insert(K key, V value) {
    int bucket = hash(key, capacity);
    if(this->hashTable[bucket].contains(key)){
        throw runtime_error("This key already exists");
      }
    this->hashTable[bucket].insert(key,value);
    size+=1;
    float loadFactor = (float)(size)/(float)(capacity);
    if(loadFactor >= maxLoadFactor){
      this->expandCapacity();
    }
   }

模板K是键,V是值。哈希表的实现是指向线性字典数组的指针(我自己实现的一个类,本质上是一个键值对的列表,它对字典有一些额外的有用功能)。但这似乎并没有扩大容量。相反,我一直得到一个错误 "key already exists"--这是一个由我的教授实现的运行时错误。

c++ hash hashmap c++-cli hashtable
1个回答
1
投票

您的 i 循环做了太多的迭代。 它正在根据新的容量进行循环,而当 temp 它所访问的数据只有旧的容量元素。

© www.soinside.com 2019 - 2024. All rights reserved.