插入HashTable

时间:2016-11-15 02:43:43

标签: c++ list vector hashtable

所以,我真的迷失在这里。我在尝试将一个项目插入哈希表时非常困难,insert(const Entry& e)我在下面发布了我最近的尝试,我知道它并不多,但截至目前它已经#39我得到的一切。任何正确方向的推动都非常感激。 我的结构和类定义应该没问题。

目前正在,

  

hTable.cc:在成员函数'void HT :: insert(const Entry&)'中:

     

hTable.cc:38:19:错误:不匹配'operator ='

当我这样做时发生错误hTable[hashVal] = new Entry(e);

  

hTable.cc:37:57:从这里要求

     

/ usr / include / c ++ / 5 / bits / predefined_ops.h:234:30:错误:表达式不能

     

用作函数

     

{return bool(_M_pred(* __ it)); }

第二个错误来自我使用find_if()的同一行,我假设它与我使用hashVal的方式有关?我确实查了find_if(),但很多解释对我来说都没有多大意义。

下面是我的结构,表格中的条目(Entry.h)

#ifndef H_ENTRY
#define H_ENTRY

#include <string>
using namespace std;

#define ID_SZ      3    // size of key
#define ITEM_SZ    24   // max size for item description 
#define TBL_SZ     31   // default size for hash table

struct Entry {
    string key,   // key
           desc;  // description
    unsigned num; // no of copies

    //constructor
    Entry ( const string& k = "", const string& d = "",
        const unsigned& n = 0 ) : key ( k ), desc ( d ),
        num ( n ) { }
};
#endif

下面是我的哈希表(hTable.h)的类定义

#include "Entry.h"
#ifndef H_HASH_TABLE
#define H_HASH_TABLE

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <list>
#include <vector>

class HT {
public:
    HT ( const unsigned& = TBL_SZ );   // constructor
    ~HT ( );                           // destructor
    void insert ( const Entry& );      // inserts item in hash table
private:
    unsigned hsize;                    // size of hash table
    vector < list < Entry > >  hTable; // hash table
    vector < Entry* > pTable;          // ptr table
    int hash ( const string& );        // hash function
};
#endif

下面是我的hTable.cc,我的问题在哪里。

#include "hTable.h"

HT::~HT() {
        for (unsigned i = 0; i < hsize; i++)
                        hTable.pop_back();
}
HT::HT(const unsigned& hs) {
        hTable.resize(hs);
        pTable.resize(hs);
}
void HT::insert(const Entry& e) {
//if key already exists, print out message saying so.
//else, insert into hash table
        //also inserts the address of the record (in the hash table) into the pointer table

    int hashVal = hash(e.key);

    if( find_if( hTable.begin(), hTable.end(), hashVal) == hTable.end() )
            hTable[hashVal] = new Entry(e);
    else
            cout << "\ntemp message\n";

}

1 个答案:

答案 0 :(得分:0)

代码中存在一些问题:

  1. 如果哈希表不允许重复的条目。无需将hTable声明为vector < list< Entry > >vector< Entry >满足要求。如果无法更改hTable的声明,则代码应为hTable[hashVal].push_back( e );

  2. 需要明确定义Entry的副本分配和复制构造函数。

  3. 哈希值的输出需要在哈希表的大小范围内,或者函数insert需要检查哈希值是否在范围内。

  4. find_if需要条件函数或仿函数。在您的代码中,它将是。

  5. 
    class CheckKey {
    public: 
        CheckKey(const string& key) : _key(hash(key)) {};
        bool operator==(Entry const& e) {
            return hash(e.key) == _key;
        }
    private:
        int hash(const string&) {...};
        int _key;
    };
    
    void HT::Insert(const Entry& e) { 
        CheckKey chk(e.key);
        vector< list< Entry > >::iterator itfind = find_if(hTable.begin(), hTable.end(), chk);
    
        if(itfind!=hTable.end() && find->empty()) {
            itfind->push_back(e);
        } else {
            ...
        }
    }