Você está na página 1de 2

#ifndef MINHA_TABELA_ESPALHAMENTO_H

#define MINHA_TABELA_ESPALHAMENTO_H

#include "MinhaListaEncadeada.h"
// MinhaListaEncadeada
#include "TabelaEspalhamentoAbstrata.h"
// TabelaEspalhamentoAbstrata
#include "excecoes.h"
// ExcecaoDadoInexistente

#include <cmath>

template<typename T, std::size_t _capacidade>


class MinhaTabelaEspalhamento final:
public TabelaEspalhamentoAbstrata<T, _capacidade>
{
//implemente aqui
protected:
// Obtém a posição correspondente na tabela para o dado.
std::size_t funcaoEspalhamento(std::string dado) const
{
std::size_t valor = 0;
for (std::size_t i = 0; i < dado.length(); i++)
{
std::size_t m = 13; //Fator de 13
std::size_t teste = dado[i] * pow(m, dado.length() - (i + 1));
valor += teste;
}
std::cout << valor << std::endl;

std::size_t chave = (valor % capacidade());


return chave;
};

std::size_t funcaoEspalhamento(int dado) const


{

std::size_t valor = (std::size_t)dado;

std::size_t chave = (valor % this->_tabela.size());


return chave;
};

public:
~MinhaTabelaEspalhamento() {}

// Obtém a capacidade da tabela.


std::size_t capacidade() const
{
return _capacidade;
};

// Obtém a quantidade de dados contidos na árvore.


std::size_t quantidade() const
{
int contador = 0;
for (int i = 0; i < this->_tabela.size(); i++)
{
contador += this->_tabela[i].getTamanho();
}
return contador;
};

// Verifica se o dado está contido na tabela.


bool contem(T dado) const
{
std::size_t chave = funcaoEspalhamento(dado);
return this->_tabela.at(chave).contem(dado);
};

// Insere um dado na tabela. Se a tabela já contiver o dado, ele não é inserido


novamente.
void inserir(T dado)
{
std::size_t chave = funcaoEspalhamento(dado);
this->_tabela.at(chave).adicionaNoFim(dado);
};

// Remove um dado da tabela. Se a tabela não contiver o dado, uma exceção


ExcecaoDadoInexistente é lançada.
void remover(T dado)
{
if (this->contem(dado))
{
std::size_t chave = funcaoEspalhamento(dado);
int posicao_do_dado_na_lista = this->_tabela.at(chave).posicao(dado);
this->_tabela.at(chave).retiraDaPosicao(posicao_do_dado_na_lista);

} else
{
throw ExcecaoDadoInexistente();
}
};

};

#endif

Você também pode gostar