我正在尝试在这里编码HashTable。我几乎编写了所有函数,程序正在编译。但是由于某些原因,我发现它的功能永远与我的主力一起运行。此外,当测试复制构造函数和运算符=程序崩溃时。下面是哈希表
structure
{
struct Record
{
TYPE data_;
string key_;
Record* Next ;
Record(const string& key, const TYPE& data)
{
key_ = key;
data_ = data;
}
Record()
{
key_ = "" ;
Next = nullptr;
}
};
int TableSize ;
Record** records ;
template <class TYPE>
bool HashTable<TYPE>::find(const string& key, TYPE& value)
{
// int index = std::hash<TYPE> {}(value)%TableSize ;
int index = std::hash<string> {}(key)%TableSize ;
Record* temp = records[index] ;
while(temp != nullptr )
{
if(temp->data_ == value && temp->key_ == key)
return true ;
temp = temp->Next ;
}
return false ;
}
operator=
template <class TYPE>
const HashTable<TYPE>& HashTable<TYPE>::operator=(const HashTable<TYPE>& other)
{
if(this != &other)
{
if(records)
{
for(int i = 0 ; i < TableSize; i++)
remove(records[i]->key_);
delete[] records ;
}
records = new Record*[other.TableSize] ;
TableSize = other.TableSize ;
for(int i = 0 ; i < other.TableSize ; i++)
{
update(records[i]->key_, records[i]->data_);
}
}
return *this;
}
template <class TYPE>
HashTable<TYPE>::HashTable(const HashTable<TYPE>& other)
{
if(other.records != nullptr)
{
if(records)
{
delete[] records ;
cout<<"delete"<<endl;
}
records = new Record*[other.TableSize];
TableSize = other.TableSize;
for(int i = 0 ; i < other.TableSize; i++)
records[i] = new Record();
for (int i = 0; i<other.TableSize; i++)
{
update(other.records[i]->key_, other.records[i]->data_);
}
}
else
{
records = nullptr;
}
}
答案 0 :(得分:0)
HashTable<TYPE>::HashTable(const HashTable<TYPE>& other)
{
// ...
if (records) {
delete[] records ;
没有可以做到这一点的情况。
你正在构建一个新对象,你还没有初始化它的任何成员(这本身就是不好的做法)。使用某些东西的价值,你有责任初始化已经很糟糕了,但删除碰巧在那里发生的任何垃圾都可能是灾难性的。
在operator=
中确实有意义,因为对象已存在。