在哈希表中使用派生类的搜索函数
Posted
技术标签:
【中文标题】在哈希表中使用派生类的搜索函数【英文标题】:Search Function Using Derived Classes in a Hash Table 【发布时间】:2015-11-30 16:38:06 【问题描述】:我的派生类以及它们如何利用从父类继承的搜索功能存在一些问题。
这是我的 .h 文件
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
#define TABLESIZE 13
#ifndef HASH_H
#define HASH_H
namespace HTGroup
template<class T>
class HashTable
protected:
struct item
T x;
item* next;
;
item* HT[TABLESIZE];
virtual int hash(T key) = 0;
virtual int collision(T key, int &value) = 0;
public:
HashTable();
virtual void printGrid();
void insert(T key);
void remove(T key);
void search(T key);
int indexItems(int index);
;
template<class T>
class DHT1 : public HashTable<T>
protected:
int hash(T key);
int collision(T key, int &value);
struct item
T x;
item* next;
;
item* HT[TABLESIZE];
public:
DHT1();
void printGrid();
;
template<class T>
class DHT2 : public HashTable<T>
protected:
int hash(T key);
int collision(T key, int &value);
struct item
T x;
item* next;
;
item* HT[TABLESIZE];
public:
DHT2();
void printGrid();
;
#endif
这是我为搜索功能实现的:
template<class T>
void HashTable<T>::search(T key)
int index = hash(key);
bool foundKey = false;
string item;
item* temp = HT[index];
while(temp != NULL)
if(temp->x == key)
foundKey = true;
item = temp->x;
temp = temp->next;
if(foundKey == true)
cout << "Item was found." << endl;
else
cout << "Item was not found." << endl;
这就是我在 main 中调用函数的方式:
hashy1.search(item);
我的搜索实现中的这一行从编译器收到错误:
item* temp = HT[index];
给我这个错误:
[Error] 'temp' was not declared in this scope
据我了解,每当派生类的对象调用搜索函数时,它都会混淆所创建的指针是属于父类还是派生类。
但奇怪的是,它让我可以在删除函数中创建其他指针而没有任何问题,并且工作正常:
template<class T>
void HashTable<T>::remove(T key)
int index = hash(key);
item* delPtr; //Where I am allowed to create pointers with
item* P1; //no issues
item* P2;
if(HT[index]->x == "")
cout << key << " was not found in the hash table" << endl;
else if ( HT[index]->x == key && HT[index]->next == NULL)
HT[index]->x = "";
cout << key << " was removed from the hash table" << endl;
else if(HT[index]->x == key)
delPtr = HT[index];
HT[index] = HT[index]->next;
delete delPtr;
cout << key << " was removed from the hash table" << endl;
else
P1 = HT[index]->next;
P2 = HT[index];
while(P1 != NULL && P1->x != key)
P2 = P1;
P1 = P1->next;
if(P1 == NULL)
cout << key << " was not found in the hash table" << endl;
else
delPtr = P1;
P1 = P1->next;
P2->next = P1;
delete delPtr;
cout << key << " was removed from the hash table" << endl;
我尝试在 .h 文件中创建指针,如下所示:
template<class T>
class DHT1 : public HashTable<T>
protected:
int hash(T key);
int collision(T key, int &value);
struct item
T x;
item* next;
item* temp; // Added declaration
;
item* HT[TABLESIZE];
public:
DHT1();
void printGrid();
;
但这仍然给我声明问题
在实现搜索功能时,我应该使用不同的方法,例如函数调用中的任何额外参数吗?或者也许我只是没有把逻辑搞清楚?
感谢您的任何回复!
【问题讨论】:
string item; item* temp = HT[index];
看到什么奇怪的东西了吗? item
是字符串,那么就不是字符串了。
【参考方案1】:
您将item
声明为std::string
,然后在与类型相同的范围内使用item
。
string item; // <-- declaring as string
item* temp = HT[index]; // <-- Compiler doesn't know what to do with this line except to give an error.
最简单的解决方案是将std::string
变量命名为item
以外的其他名称。
【讨论】:
哇,我不敢相信我错过了。有时你只需要一双新鲜的眼睛!感谢您的快速回复!以上是关于在哈希表中使用派生类的搜索函数的主要内容,如果未能解决你的问题,请参考以下文章