我需要能够使用线性探测执行以下操作。我相信上面的代码应该能够完成这项工作但不能正确编译。任何建议将不胜感激。
从x[0]
到x[7]
的In和数组,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();
}
答案 0 :(得分:0)
首先,您有一个编译警告,并带有明确的信息:
main.cpp:71:3:警告:控件可能会达到非空函数的结束[-Wreturn-type]
bool contains(int v)
应返回一个布尔值,但在函数末尾没有任何布尔值。
如果您尝试使用这些标志进行编译,那么您还有另一个问题:-Wall -Wextra -Werror
main.cpp:22:59:错误:字段'limit'将在字段后初始化 'used'[-Werror,-Wreorder]
此消息非常清楚,您对HashMap类的初始化顺序错误,您需要在used
之前初始化limit
,因为您的变量是按此顺序声明的。
私人:
int *table; int used; int limit; int *hist;
因此:
Hashmap(int initialSize)
: table(new int[initialSize]) , used(0) , limit(initialSize) , hist(new int[0])
编译器是你的朋友,学会理解它的咆哮,它将帮助你理解你的代码和缺陷。
PS: 在代码中使用裸指针是一种不好的做法,它非常C风格。
尝试使用C ++功能,例如vector。
答案 1 :(得分:0)
首先,如果您想使用sizeof(table)
获取表格的元素数量(大小),您将无法获得它。
您将表定义为int *
,因此sizeof
将为您提供构成指针的字节数。
如果您坚持使用要在运行时分配的C数组,则需要将其大小保持为单独的变量。
(顺便说一下,如果你要像固定大小的数组int table[5]
那样初始化你的表格,你就能得到这样的长度:sizeof(table)/sizeof(int)
。但你不想要这可以在这里,或者你不能拥有动态哈希表。)
其次,即使您使用当前代码获取表大小,如果数组不包含至少一个0条目且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);
}
}
至少,您应该在完整回合后退出,返回false。