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);
}
}