所以,我真的迷失在这里。我在尝试将一个项目插入哈希表时非常困难,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";
}
答案 0 :(得分:0)
代码中存在一些问题:
如果哈希表不允许重复的条目。无需将hTable
声明为vector < list< Entry > >
。 vector< Entry >
满足要求。如果无法更改hTable
的声明,则代码应为hTable[hashVal].push_back( e );
需要明确定义Entry
的副本分配和复制构造函数。
哈希值的输出需要在哈希表的大小范围内,或者函数insert
需要检查哈希值是否在范围内。
find_if
需要条件函数或仿函数。在您的代码中,它将是。
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 {
...
}
}