Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线性探测码_C++ - Fatal编程技术网

C++ 线性探测码

C++ 线性探测码,c++,C++,我需要能够执行以下使用线性探测。我相信上面的代码应该能够完成这项工作,但它没有正确编译。任何建议都将不胜感激 在从x[0]到x[7]的和数组中,对于n=8,插入3、11、15、23和31 #include <iostream> #include <string> using namespace std; class Hashmap { private: int* table; int used; int limit; int* hist; void grow()

我需要能够执行以下使用线性探测。我相信上面的代码应该能够完成这项工作,但它没有正确编译。任何建议都将不胜感激

在从
x[0]
x[7]
的和数组中,对于
n=8
,插入3、11、15、23和31

#include <iostream>
#include <string>

using namespace std;

class Hashmap {

private:
int* table;
int used;
int limit;
int* hist;

void grow() {
    cout << "resizing" << endl;
    limit = limit*2;
    return;

}

public:
Hashmap(int initialSize) : table(new int[initialSize]), limit(initialSize),     used(0), hist(new int[0]) {
        int i;
    for (i = 1; i <= initialSize; i *= 2){
        ;
    }

    table =  new int[i];
    used = 0;
    limit = i / 2;
    hist = new int[60];
}



~Hashmap() {
    delete [] table;
}


int hash(int v) {
return v & (sizeof(table) - 1);
}

void add(int v) {
used++;
if (used > limit)
    grow();
int i = hash(v);
int count = 0;
while (table[i] != 0) {
    i = (i+1) % sizeof(table);
    count++;
    if (count >= 60)
        count = 59;
    hist[count]++;
}
table[i] = v;

}

bool contains(int v) {
    int i = hash(v);
    while (table[i] != 0) {
        if (table[i] == v)
            return true;
        else
            i = (i + 1) % sizeof(table);
    }

}

void output() {
table[0] = 0;
cout << table[0];
for (int i = 0; i < 8; i++)
cout << "," << table[i] << endl;

}
};


int main() {

Hashmap m(8);
int n;
for (int i = 3; i < 32; i = i + n){
    if (i == 11) {
    n = 4;
    m.add(i);
    }
    else
    n = 8;
    m.add(i);
}

m.output();



}
#包括
#包括
使用名称空间std;
类哈希映射{
私人:
int*表格;
使用int;
整数极限;
int*hist;
void grow(){

cout首先,您有一个带有明确信息的警告:

main.cpp:71:3:警告:控件可能到达非无效函数的末尾[-Wreturn类型]

bool contains(int v)
应返回一个布尔值,但函数末尾没有任何布尔值

如果尝试使用这些标志编译,则会遇到另一个问题:-Wall-Wextra-Werror

main.cpp:22:59:错误:字段“limit”将在字段之后初始化 “已使用”[-Werror,-Wreorder]

同样,消息非常清楚,HashMap类的初始化顺序是错误的,您需要在
限制之前初始化
使用的
,因为您的变量是按该顺序声明的

私人:

int  *table;
int  used;
int  limit;
int  *hist;
因此:

Hashmap(int initialSize)

编译器是你的朋友,学会理解它的咆哮,它将帮助你理解你的代码和缺陷

附言: 在代码中使用裸指针是一种不好的做法,这是非常C风格的


尝试使用C++特性,如vector替代.< /p> 首先,如果你想用<代码> siZeof(表)获取表的元素数(大小),你就得不到它。 您将表定义为

int*
,因此
sizeof
将给出组成指针的字节数

如果坚持使用要在运行时分配的C数组,则需要将其大小作为单独的变量

(顺便说一句,如果您将表初始化为固定大小的数组
int table[5]
,您将能够获得如下长度:
sizeof(table)/sizeof(int)
。但您不希望在这里使用此值,否则将无法获得动态哈希表。)

其次,即使您使用当前代码获取表大小,如果数组不包含至少一个0条目,并且v不存在,您也永远不会退出以下循环,因为您会在其上不断循环(使用模表大小)


至少,您应该在一整轮后退出,返回false。

错误是什么,在哪一行?您的代码可以通过编译,但它将进入死循环。
: table(new int[initialSize])
, used(0)
, limit(initialSize)
, hist(new int[0])
bool contains(int v) {
    int i = hash(v);
    while (table[i] != 0) {
        if (table[i] == v)
            return true;
        else
            i = (i + 1) % sizeof(table);
    }

}