| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2011 14:44:58
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
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? |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2011 15:28:10
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
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? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2011 15:50:04
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2011 15:52:48
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
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? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2011 16:05:50
|
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:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2011 16:09:00
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2011 16:11:58
|
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"] = "" - )
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2011 16:45:37
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
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? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/12/2011 07:11:27
|
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) ?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/12/2011 08:28:18
|
juliocbq
GUJ Expert
![[Avatar]](/images/avatar/153704bb24a28e9a6bb49e8ffde1492e.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/12/2011 08:35:26
|
douglaskd
GUJ Ranger
![[Avatar]](/images/avatar/836e08ad1864b72840258c910b729fb6.jpg)
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!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/12/2011 08:43:01
|
juliocbq
GUJ Expert
![[Avatar]](/images/avatar/153704bb24a28e9a6bb49e8ffde1492e.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/12/2011 09:02:02
|
douglaskd
GUJ Ranger
![[Avatar]](/images/avatar/836e08ad1864b72840258c910b729fb6.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/12/2011 09:06:55
|
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.)
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/12/2011 11:03:24
|
juliocbq
GUJ Expert
![[Avatar]](/images/avatar/153704bb24a28e9a6bb49e8ffde1492e.jpg)
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.
|
|
|
 |
|
|