首页 > 解决方案 > 垃圾值被初始化为我的哈希表的值,即使我专门将所有索引编码为 -1

问题描述

我不知道我是否遗漏了一些非常简单的东西,但是我无法将空哈希表的所有值初始化为 -1。我有另一个带有 ID 号的数组(我将对其进行哈希处理)。我将所有值初始化为 -1,因为我可以稍后检查我的哈希数组的值是否为 -1,然后我可以插入而无需二次探测。

在我的构造函数中,我初始化了表大小。然后我创建一个具有该大小的数组。然后我将我的私有指针指向该数组,这样我就可以随时访问它。从那里,我初始化我的表......我对构造函数中的 for 循环有疑问:

如果有人能启发我,那就太好了。谢谢。


HashTable::HashTable(int bsize)
{
    this->tableSize= bsize; 
    int arr[bsize]; //creating an array to hold hash values 
    table = arr; //table pointer points to our new array
    for(int i = 0; i < bsize; i++){ 
        table[i] = -1; 
    }
}

void  HashTable:: printTable(){
    for(int i = 0; i < tableSize; i++){
        cout << table[i] << endl;
    }
}

这是我的课

class HashTable
{
    int tableSize = 40009;  // No. of buckets
    
    // Pointer to an array containing buckets
    int *table;
    int numOfcolision =0;
public:
    HashTable(int bsize);  // Constructor

    // inserts a key into hash table
    bool insert(int key);

    // hash function to map values to key
    unsigned int hashFunction(int key);

    void printTable();
    int getNumOfCollision();

    int search(int key);
};

标签: c++arrayspointershashtable

解决方案


在您的构造函数中:

int arr[bsize]; //creating an array to hold hash values 

这是非标准的 C++。可变长度数组不是标准 C++。在标准 C++ 中,所有数组大小都是常数在编译时而不是运行时确定。但是,更重要的是,这是构造函数中的局部变量。

table = arr; //table pointer points to our new array

table大概是一个指针类成员。这将类成员初始化为指向构造函数中的本地数组。

但是一旦构造函数返回,数组就会被销毁,就像所有其他在声明它们的地方函数的局部变量一样。在类成员中使用指针成为未定义的行为,对您来说,这表现为随机垃圾。

在 C++ 中,数组不是这样工作的。您需要将类中的指针/数组混合替换为std::vector. 您将在您的 C++ 教科书中找到有关如何使用 的更多信息std::vector以及许多使用它们的示例。


推荐阅读