我正在尝试学习C ++并尝试编写一个简单的哈希表的代码,如下面的结构:
array[0][0] array[0][1] array[0][2]
key 1 value 1 value 2
array[1][0] array[1][1]
key 2 value 3
array[2][0] array[2][1] array[2][2]
key 3 value 4 value 5
表示动态数组的数组。现在,下面是我的代码:
#include<iostream>
#include<conio.h>
using namespace std;
int ele [10] ;
int** arrays = new int*[10] ;
class HashTable
{
public:
HashTable()
{
for(int i = 0 ; i < 10 ; i++)
ele[i] = - 1 ; // element array stores the number of elements in column of each row
}
void put(int key, int value){
if(ele[key] == -1){
arrays[key] = new int[1];
arrays[key][0] = value ; // initialize 2nd dimention
ele[key] = 0 ;
}
else{
int num = ele[key] ;
int temp[num + 1] ;
for(int i = 0 ; i < num ; i++)
temp [i] = arrays[key][i] ;
temp[num+1] = value ;
arrays[key] = new int[num + 1] ;
for(int i = 0 ; i < num+1 ; i++) // take all the elements in an temporary array and store it back
arrays[key][i] = temp [i] ;
ele[key] = num + 1 ;
}
}
};
main()
{
HashTable object;
object.put(0 , 100);
object.put(1 , 200);
object.put(3 , 300);
object.put(3 , 3000);
object.put(3 , 30000);
object.put(5 , 500);
object.put(5 , 5000);
object.put(5 , 50000);
object.put(5 , 50);
for (int i = 0 ; i < 10 ; i++ ){
int j = ele[i] ;
cout << j << " K ";
if(j != -1){
for (int k = -1 ; k < j ; k++ ) // print the values of corresponding keys
cout << arrays[i][k] << " ";
}
}
getch();
return 0;
}
使用put方法将值放在自定义HashTable中。
任何人都可以帮我解释为什么上面的代码在尝试检索相应密钥的值时会给出错误的输出值。
答案 0 :(得分:2)
这无效:
for (int k = -1 ; k < j ; k++ )
cout << arrays[i][k] << " ";
您不能拥有负索引的数组。当您进入循环时,您有k = -1
,因此您尝试访问arrays[i][-1]
,但这无法正常工作。
其他建议:
arrays
和ele
应该是您班级的成员,并在其中声明(作为私人成员)arrays[key] = new int[num + 1]
的行上,您忘记在上一个对象上调用delete
。这将导致内存泄漏。arrays
(例如put
方法),然后使用object.print()
调用它(如果您将其命名为print
) if(j != -1)
之前测试for (int k = -1; k < j; k++)
是多余的:如果j == -1
您将永远不会进入循环。