first hashtable implementation
This commit is contained in:
commit
014b381086
|
@ -0,0 +1,151 @@
|
|||
#pragma once
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <mutex>
|
||||
#include <taskflow/taskflow.hpp>
|
||||
|
||||
template<typename T>
|
||||
class HashTable {
|
||||
public:
|
||||
struct elem {
|
||||
public:
|
||||
T* data;
|
||||
int key;
|
||||
};
|
||||
struct hashList {
|
||||
public:
|
||||
std::vector<elem> list;
|
||||
};
|
||||
|
||||
int size;
|
||||
int elements;
|
||||
std::vector<hashList> table;
|
||||
|
||||
HashTable(int size);
|
||||
~HashTable();
|
||||
|
||||
void insert(int id, T* n);
|
||||
bool search(int id);
|
||||
bool remove(int id);
|
||||
|
||||
void restructure();
|
||||
|
||||
int getSize();
|
||||
int getElements();
|
||||
double getUtilization();
|
||||
|
||||
void print();
|
||||
|
||||
int hash(int id);
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
HashTable<T>::HashTable(int size) {
|
||||
this->size = size;
|
||||
this->table = std::vector<hashList>(size);
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
HashTable<T>::~HashTable() {
|
||||
//table.clear();
|
||||
//table.shrink_to_fit();
|
||||
std::vector<hashList>().swap(table);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
int HashTable<T>::getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
int HashTable<T>::getElements() {
|
||||
return elements;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
double HashTable<T>::getUtilization() {
|
||||
return (double)elements/size;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
int HashTable<T>::hash(int id) {
|
||||
return id % size;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
bool HashTable<T>::search(int id) {
|
||||
int index = hash(id);
|
||||
std::vector<elem> list = table.at(index).list;
|
||||
for (auto it = list.begin(); it != list.end(); ++it) {
|
||||
if (it->key == id) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
void HashTable<T>::insert(int id, T* data) {
|
||||
int index = hash(id);
|
||||
if (search(id)){
|
||||
std::vector<elem> list = table[index].list;
|
||||
for (auto it = table[index].list.begin(); it != table[index].list.end(); ++it) {
|
||||
if (it->key == id) {
|
||||
it->data = data;
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
table[index].list.push_back(elem{ data, id });
|
||||
elements++;
|
||||
}
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
bool HashTable<T>::remove(int id) {
|
||||
int index = hash(id);
|
||||
std::vector<elem> list = table[index].list;
|
||||
int elemindex = 0;
|
||||
|
||||
for (auto it = table[index].list.begin(); it != table[index].list.end(); ++it) {
|
||||
if (it->key == id){
|
||||
table[index].list.erase(table[index].list.begin() + elemindex);
|
||||
elements--;
|
||||
return true;
|
||||
}
|
||||
elemindex++;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
void HashTable<T>::print() {
|
||||
|
||||
for (auto it = table.begin(); it != table.end(); ++it) {
|
||||
std::cout << "Next list" << std::endl;
|
||||
for (auto it2 = it->list.begin(); it2 != it->list.end(); ++it2) {
|
||||
std::cout << it2->data << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
void HashTable<T>::restructure() {
|
||||
|
||||
std::vector<hashList>oldTable = table;
|
||||
|
||||
size = size * 2;
|
||||
table = std::vector<hashList>(size);
|
||||
|
||||
for (auto it = oldTable.begin(); it != oldTable.end(); ++it) {
|
||||
for (auto it2 = it->list.begin(); it2 != it->list.end(); ++it2) {
|
||||
insert(it2->key, it2->data);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
#pragma once
|
||||
|
||||
#include "HashTabelle.h"
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <taskflow/taskflow.hpp>
|
||||
|
||||
using namespace std;
|
||||
|
||||
struct Customer {
|
||||
int id;
|
||||
string vorname;
|
||||
string nachname;
|
||||
|
||||
friend ostream& operator<<(ostream& os, const Customer& c) {
|
||||
os << "Id: " << c.id << "\n" << "Vorname: " << c.vorname << "\n" << "Nachname: " << c.nachname << "\n";
|
||||
return os;
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
Customer c{ 20, "Max", "Mustermann" };
|
||||
Customer d{ 30, "Tom", "Mot" };
|
||||
|
||||
|
||||
HashTable<Customer> table = HashTable<Customer>(10);
|
||||
|
||||
table.insert(20, &c);
|
||||
table.insert(30, &c);
|
||||
table.insert(21, &c);
|
||||
table.insert(21, &d);
|
||||
|
||||
std::cout << table.search(30) << std::endl;
|
||||
|
||||
table.remove(30);
|
||||
|
||||
std::cout << table.search(30) << std::endl;
|
||||
|
||||
table.remove(40);
|
||||
|
||||
table.restructure();
|
||||
|
||||
table.print();
|
||||
}
|
Loading…
Reference in New Issue