1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

hash_set em c++

Discussão em 'Programação' iniciada por prosaQue, 13 de Dezembro de 2008. (Respostas: 3; Visualizações: 433)

  1. prosaQue

    prosaQue Power Member

    Boas,
    Estou aqui com um problema a trabalhar com hash_set que não tou a conseguir resolver. Sempre que faço um find, ele nunca encontra nada. Acho que tenho as minhas funções de hash bem definidas, não percebo.
    Estou a usar o Visual Studio. Se alguém me podesse ajudar agradecia imenso.

    Código:
    #include "stdafx.h"
    #include <string>
    #include <hash_set>
    #include <iostream>
    using namespace std;
    using namespace stdext;
    
    struct Pessoa{
        string nome;
    };
    
    class mycompare : public stdext :: hash_compare<Pessoa>
    {
    public:
        size_t operator()(const Pessoa & s) const{        
               size_t valor = 0;
                for (unsigned int i = 0; i != s.nome.size(); i++)
                {
                    valor+=37*i*valor+s.nome[i];
                }
                return valor;
        }
        bool operator() (const Pessoa & s1, const Pessoa & s2) const{
            return (s1.nome==s2.nome);
        }
    };
    
     int _tmain(int argc, _TCHAR* argv[])
    {
        
        hash_set<Pessoa, mycompare> tabela;
        Pessoa p;
        p.nome="joao";
        tabela.insert(p);
        hash_set<Pessoa, mycompare>::iterator it =tabela.find(p);
        
        if(it==tabela.end())
            cout << "Erro. deveria ter encontrado";                             //entra aqui
    
        while(it->nome=="")
            it++;
          cout <<  it->nome;                                                         //imprime joao
    
        system("pause");
        return 0;
    }
    
    
     
    Última edição: 13 de Dezembro de 2008
  2. prosaQue

    prosaQue Power Member

    Afinal consegui resolver mais rapidamente do que pensava o problema, fiz umas alterações na função de hash e já está a funcionar bem. Deixo aqui a solução caso alguém tenha o mesmo problema que eu.
    Código:
    #include "stdafx.h"
    #include <string>
    #include <hash_set>
    #include <iostream>
    using namespace std;
    using namespace stdext;
    struct Pessoa{
        string nome;
    };
    
    namespace stdext {
       size_t hash_value( const Pessoa& s )
       {
          size_t valor = 0;
                for (unsigned int i = 0; i != s.nome.size(); i++)
                {
                    valor+=37*i*valor+s.nome[i];
                }
                return valor;
        }
     }
    bool operator < (const Pessoa & s1, const Pessoa & s2)
    {
      return (s1.nome<s2.nome);
    }
    
     int _tmain(int argc, _TCHAR* argv[])
    {
        
        hash_set<Pessoa> tabela;
        Pessoa p;
        p.nome="joao";
        tabela.insert(p);
        hash_set<Pessoa>::iterator it =tabela.begin();
        
        cout << it->nome;                     //imprime joao
    
        system("pause");
        return 0;
    }
    
    
     
  3. OubeLa

    OubeLa Power Member

  4. prosaQue

    prosaQue Power Member

Partilhar esta Página