存储 key/value的hashtable

来源:互联网 发布:在windows上启动mysql 编辑:程序博客网 时间:2024/05/29 03:12
#include<iostream>
#include<string>
#include<vector>
#include<utility>
using namespace std;
// key/value 哈希表


const int TABLESIZE = 10;


class DataNode{
public:
DataNode(string k, string v){
key=k;
value=v;
}
public:
string key;
string value;
};


class HashTable{
public:
bool addNode(string k, string v);
string findValue(string k);
bool deleteNode(string k);
int hashFunc(string k); //return 0-TABLESIZE-1
void display();
private:
vector<DataNode> hashTable[TABLESIZE];
};


void
HashTable::display(){
for(int i=0;i<TABLESIZE;++i){
cout<<"Node"<<i<<": -> ";
for(int j=0; j<hashTable[i].size(); ++j){
cout<<hashTable[i][j].key<<"-"<<hashTable[i][j].value<< " -> ";
}
cout<<endl;
}
}




//key值重复, 直接覆盖
bool
HashTable::addNode(string k, string v){
int index = hashFunc(k);
for(int i=0; i<hashTable[index].size(); ++i){
if(hashTable[index][i].key==k){
cout<<"==!!!"<<endl;
hashTable[index][i].value = v;
return true;
}
}
hashTable[index].push_back(DataNode(k,v));
}


string
HashTable::findValue(string k){
int index = hashFunc(k);
for(int i=0; i<hashTable[index].size(); ++i){
if(hashTable[index][i].key==k){
return hashTable[index][i].value;
}
}
string res = "";
return res;
}


bool 
HashTable::deleteNode(string k){
int index = hashFunc(k);
vector<DataNode>::iterator iter=hashTable[index].begin();
for(; iter!=hashTable[index].end();++iter){
if(iter->key==k){
hashTable[index].erase(iter);
return true;
}
}
return false;
}


int
HashTable::hashFunc(string k){
int sum = 0;
for(int i=0;i<k.length();++i){
sum += k[i];
}
return sum%10;
}




int main(){
HashTable ht;
ht.addNode("key1","val1");
ht.addNode("key2","valddd");
ht.addNode("key3","valddd");
ht.addNode("key4","valddd");
ht.addNode("key1","va222");

string res = ht.findValue("key4");
if(res.empty()){
cout<<"res==NULL"<<endl;

}else{
cout<<res<<endl;
}
ht.deleteNode("key3");
ht.display();


return 0;
}
0 0