在哈希表中使用派生类的搜索函数

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 以外的其他名称。

【讨论】:

哇,我不敢相信我错过了。有时你只需要一双新鲜的眼睛!感谢您的快速回复!

以上是关于在哈希表中使用派生类的搜索函数的主要内容,如果未能解决你的问题,请参考以下文章

哈希表详解

哈希表详解

iOS中的哈希表

c++,在哈希表中显示内容的方法。使用双链表

Java集合哈希表及哈希函数的实现方式

数据结构与算法实例(哈希表实现)