我希望在调用rehash函数时调整数组大小,方法是将初始字典的值复制到其中,然后最后将newdictionary重新定义为字典
void rehash ()
{
int newsize=2*Size;
node **newdictionary;
newdictionary= new node*[newsize];
//Initialising the dictionary
for (int i = 0;i < newsize;i++)
{
newdictionary[i]->name = "";
newdictionary[i]->value = -1;
}
node **temp=dictionary;
delete [] dictionary;
dictionary=newdictionary;
SIZE=newsize;
for(int i=0;i<SIZE;i++)
{
if(temp[i]->value!= -1)
insertvalue(temp[i]->name,temp[i]->value);
}
delete [] temp;
};
之前我已将insertvalue定义为:
void insertvalue (string filedata, int code)
{
// tableindex is the position where I want to insert the value
dictionary[tableindex]->name= filedata;
dictionary[tableindex]->value=code;
};
答案 0 :(得分:0)
您实际上没有解释您遇到的问题,但您的代码有几个问题:
void rehash ()
{
int newsize=2*Size;
node **newdictionary;
newdictionary= new node*[newsize];
此时,newdictionary
只是一个未初始化的指针数组。
//Initialising the dictionary
for (int i = 0;i < newsize;i++)
{
newdictionary[i]->name = "";
newdictionary[i]->value = -1;
}
所以上面的循环试图访问那些尚不存在的node
个对象的成员。
node **temp=dictionary;
delete [] dictionary;
这两条线路没有意义。 dictionary
和temp
指向相同的记忆。因此,当您删除dictinoary
时,您已删除temp
指向的内存。
dictionary=newdictionary;
SIZE=newsize;
for(int i=0;i<SIZE;i++)
{
if(temp[i]->value!= -1)
insertvalue(temp[i]->name,temp[i]->value);
}
即使您还没有从temp
下删除内存,您现在正试图从0访问temp
到新尺寸,而不是旧尺寸。换句话说,这将超出其范围访问temp
。
到目前为止,这些是我在代码中注意到的主要问题。在此之前,您至少需要纠正所有这些问题。你可能需要花一些时间来真正地逐步完成你的逻辑,以确保它最终有意义。