boost::unordered_map C++ comportamento estranho  XML
Índice dos Fóruns » Assuntos gerais (Off-topic)
Autor Mensagem
rodrigo.bossini
GUJ Master
[Avatar]

Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline

Oi pessoal,

Estou usando um boost::unordered_map <const char *,std::vector ><const char *> > para armazenar dados de um arquivo.

Meu problema é que a comparação entre chaves não parece estar funcionando como esperado..

Por exemplo, no arquivo tenho uma chave "tam_bloco" que é armazenada corretamente no mapa e seu vector associado também é adicionado sem problema.

Mas quando dou um get ("tam_bloco" nesse mapa, ele diz que não encontrou nada no mapa com essa chave...embora antes disso eu ter acabado de verificar
que a chave está sim no mapa, e com um vector com alguns elementos associado..

Pesquisando um pouco, descobri que poderia ser necessário informar uma função para o mapa usar para comparar as chaves..então passei a usar um

boost::unordered_map <const char *,std::vector ><const char *>, boost::hash<const char *>,eqstr >

Esse eqstr é isso aqui:


O bizarro é que com esse código, executo várias vezes e obtenho resultados diferentes..às vezes ele acha a chave no mapa..e às vezes diz que não tem nada..o mesmíssimo código..sem alterar nada..mostra resultados diferentes a cada execução...como pode isso?

Cheguei a tentar usar uma std::equal_to<const char *> nesse mesmo mapa, no lugar de eqstr..mas aí ele nunca encontra a chave que tenho certeza que está lá...alguma luz?


http://www.rodrigobossini.com.br/

Meu Twitter:@rodrigobossini
Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo?
rodrigo.bossini
GUJ Master
[Avatar]

Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline

"Resolvi" o problema trocando minha função de comparação para


Mas gostaria muito se alguém comentasse o problema que mostrei acima.

Rodrigo.

This message was edited 1 time. Last update was at 30/11/2011 15:38:07


http://www.rodrigobossini.com.br/

Meu Twitter:@rodrigobossini
Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo?
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Se é um mapa de Strings, por que não fez um std::map<string, string>?

Não use char*. Além de ser bem mais difícil e sujeito a erros, é mais lento que usar a classe std::string.


Não se esqueça também que em C++ strings são objetos mutáveis. E você não deve alterar seu conteúdo uma vez que elas se tornem chaves no mapa.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
rodrigo.bossini
GUJ Master
[Avatar]

Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline

ViniGodoy wrote:Se é um mapa de Strings, por que não fez um std::map<string, string>?

Não use char*. Além de ser bem mais difícil e sujeito a erros, é mais lento que usar a classe std::string.


Não se esqueça também que em C++ strings são objetos mutáveis. E você não deve alterar seu conteúdo uma vez que elas se tornem chaves no mapa.


Pra ser sincero nem lembro mais pq to usando char *. Acho que é pq estou usando coisas do C, como strtok. Aliás, tem algum método split em c++?

http://www.rodrigobossini.com.br/

Meu Twitter:@rodrigobossini
Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo?
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

No Boost, quando você usa o unordered_map como

typedef unordered_map<char *, char *> map_charptr;

ou coisa parecida, na verdade ele está usando o default

typedef unordered_map<char *, char *, boost::hash<char *> > map_charptr;

Se você olhar a definição de boost::hash (em boost/functional/hash.hpp), vai ver que existe uma especialização desse template para boost::hash<string> mas não para char*. Você poderia fazer algo como:



entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

rodrigo.bossini wrote:
ViniGodoy wrote:Se é um mapa de Strings, por que não fez um std::map<string, string>?

Não use char*. Além de ser bem mais difícil e sujeito a erros, é mais lento que usar a classe std::string.


Não se esqueça também que em C++ strings são objetos mutáveis. E você não deve alterar seu conteúdo uma vez que elas se tornem chaves no mapa.


Pra ser sincero nem lembro mais pq to usando char *. Acho que é pq estou usando coisas do C, como strtok. Aliás, tem algum método split em c++?


Se estiver usando o Boost, use boost::regex_split (ou então regex_token_iterator) , se quiser fazer uma cópia "ipsis litteris" do String.split do Java, ou então boost::algorithm::string::split (que é mais leve que o regex_split) se a string for fixa ou então for um de uma série de caracteres.
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Em particular, prefiro usar um unordered_map<string, string> porque se você tiver algo como:


em vez de quebrar seu programa ao não conseguir acessar uma chave inexistente, vai retornar uma string vazia, o que normalmente é uma coisa desejável (embora tenha o efeito colateral de fazer o equivalente a m["def"] = "" - )
rodrigo.bossini
GUJ Master
[Avatar]

Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline

entanglement wrote:
rodrigo.bossini wrote:
ViniGodoy wrote:Se é um mapa de Strings, por que não fez um std::map<string, string>?

Não use char*. Além de ser bem mais difícil e sujeito a erros, é mais lento que usar a classe std::string.


Não se esqueça também que em C++ strings são objetos mutáveis. E você não deve alterar seu conteúdo uma vez que elas se tornem chaves no mapa.


Pra ser sincero nem lembro mais pq to usando char *. Acho que é pq estou usando coisas do C, como strtok. Aliás, tem algum método split em c++?


Se estiver usando o Boost, use boost::regex_split (ou então regex_token_iterator) , se quiser fazer uma cópia "ipsis litteris" do String.split do Java, ou então boost::algorithm::string::split (que é mais leve que o regex_split) se a string for fixa ou então for um de uma série de caracteres.


To tentando usar o split da boost e tá dando erro..tem alguma opção que tenho de passar para o linker?

http://www.rodrigobossini.com.br/

Meu Twitter:@rodrigobossini
Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo?
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline



Uai - compilei o programa acima (tanto com o Microsoft C++ quanto com o g++) e não tive problemas. Por acaso você está usando alguma opção esquisita do Boost que força o uso de bibliotecas dinâmicas (DLL ou .SO) ?
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Offline

rodrigo.bossini wrote:
entanglement wrote:
rodrigo.bossini wrote:
ViniGodoy wrote:Se é um mapa de Strings, por que não fez um std::map<string, string>?

Não use char*. Além de ser bem mais difícil e sujeito a erros, é mais lento que usar a classe std::string.


Não se esqueça também que em C++ strings são objetos mutáveis. E você não deve alterar seu conteúdo uma vez que elas se tornem chaves no mapa.


Pra ser sincero nem lembro mais pq to usando char *. Acho que é pq estou usando coisas do C, como strtok. Aliás, tem algum método split em c++?


Se estiver usando o Boost, use boost::regex_split (ou então regex_token_iterator) , se quiser fazer uma cópia "ipsis litteris" do String.split do Java, ou então boost::algorithm::string::split (que é mais leve que o regex_split) se a string for fixa ou então for um de uma série de caracteres.


To tentando usar o split da boost e tá dando erro..tem alguma opção que tenho de passar para o linker?


Não se esqueça de incluir os headers das classes. O compilador não irá te avisar que estão "faltando " explicitamente.
#include <boost/algorithm/string.hpp>

por via das dúvidas consulte a documentação.

http://www.boost.org/doc/libs/1_48_0/doc/html/string_algo.html
http://www.boost.org/doc/libs/1_48_0/doc/html/string_algo/usage.html#id3115768

www.citrox.com.br
douglaskd
GUJ Ranger
[Avatar]

Membro desde: 04/07/2010 00:51:49
Mensagens: 839
Localização: Campinas - SP
Offline

muito interessante esses assuntos, parece bem complexo e desafiante

vou dar uma aproveitada =)

conheço C e um pouco sobre ponteiros, filas, pilhas..etc..

vocês poderiam me indicar algum material pra partir pro C++ e essa tal de boost ??? que não seja tão dificil...

acabei de dar uma lida nesse site: http://pt.kioskea.net/faq/10156-introducao-ao-stl-em-c-standard-template-library

nao sei se tem muito a ver...

muito obrigado!
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Offline

douglaskd wrote:muito interessante esses assuntos, parece bem complexo e desafiante

vou dar uma aproveitada =)

conheço C e um pouco sobre ponteiros, filas, pilhas..etc..

vocês poderiam me indicar algum material pra partir pro C++ e essa tal de boost ??? que não seja tão dificil...

acabei de dar uma lida nesse site: http://pt.kioskea.net/faq/10156-introducao-ao-stl-em-c-standard-template-library

nao sei se tem muito a ver...

muito obrigado!


Eu acho a boost muito leve e interressante, mas acho também o qt framework mais robusto. Ele possui todas esses containers e estruturass implementados usando memory sharing.
http://qt.nokia.com/products/
http://qt.nokia.com/learning


Eu poderia resolver o problema acima com o método QString::split

http://doc.qt.nokia.com/latest/qstring.html
http://doc.qt.nokia.com/latest/qstring.html#split


http://doc.qt.nokia.com/latest/qsharedmemory.html#details

This message was edited 1 time. Last update was at 01/12/2011 08:47:10


www.citrox.com.br
douglaskd
GUJ Ranger
[Avatar]

Membro desde: 04/07/2010 00:51:49
Mensagens: 839
Localização: Campinas - SP
Offline

só mais algumas dúvidas...

o QT é um framework grafico certo?, eu conseguiria trabalhar com estrutuas nele com facilidade sem conhecer a Boost...?

ja a boost é um framework parecido com o QT, ex..possui modo gráfico essas coisas?

dentre as duas, qual seria mais interessante aprender, se meu interesse fosse sistemas embarcados...

Obrigado
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

1) Você pode usar a biblioteca Qt sem ter uma aplicação "gráfica", usando apenas as estruturas de dados e outras facilidades (como suporte a threading) que ela tem.
2) A biblioteca Boost tem uma orientação completamente diferente: ela não é para gráficos, mas para todas as outras coisas (suporte a threading, estruturas de dados, grafos, algoritmos diversos, etc.)
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Offline

entanglement wrote:1) Você pode usar a biblioteca Qt sem ter uma aplicação "gráfica", usando apenas as estruturas de dados e outras facilidades (como suporte a threading) que ela tem.
2) A biblioteca Boost tem uma orientação completamente diferente: ela não é para gráficos, mas para todas as outras coisas (suporte a threading, estruturas de dados, grafos, algoritmos diversos, etc.)



Sim, e como a boost se torna parte da standard lib no c++11, você ganrante a portabilidade entre plataformas.
 
Índice dos Fóruns » Assuntos gerais (Off-topic)
Ir para:   
Powered by JForum 2.1.8 © JForum Team