Tenho que fazer um trabalho onde tenho que ler um arquivo de pares de palavras. Só que pode haver a situação onde a primeira palavra pode vir em duas linhas. Quando tento mapear usando Hashtable ou Map não aceita dois mapeamentos com mesma chave.
Segue exemplo:
Hashtablem1=newHashtable();m1.put("A","Um");m1.put("B","Dois");m1.put("C","Tres");m1.put("B","Quatro");System.out.println(m1.toString());//Saída: {A=Um, C=Tres, B=Quatro}//"B" foi sobrescrevido
Assim, você cria um mapa que associa a palavra a uma lista de linhas. :)
T
thingol
Em C++ há o template map<> (correspondente ao java.lang.TreeMap<>) e o template multimap<> (que não tem correspondente). O problema do multimap é que ele é um pouco "desajeitado". Comparando o multimap com o Map<String, List><String>> apresentado pelo Vinigodoy, prefiro a opção Java. Dou um exemplo depois.
H
hugomalta
Valeu pelas dicas pessoal!
Neste momento estou no trabalho e meu horário de almoço já acabou.
Assim que tiver oportunidade eu vou fazer os testes!
Caso eu encontre dificuldades eu passo para os próximos itens do trabalho, assim eu não fico parado em um problema sendo que o restante eu consigo fazer!
Abraço!
ViniGodoy
Eu concordo com você. Também não tenho uma experiência das melhores com o multimap. Outra coisa que acho legal das Collections em relação a STL é o fato delas respeitarem uma hierarquia lógica de classes. As do C++ são pouco relacionadas, até porque um dos objetivos dela (bem atingido por sinal) era ter uma performance absurdamente rápida, com o menor footprint possível.
T
thingol
As coisas esquisitas do multimap:
a) Você usa muito o template "pair" para representar uma estrutura de dados "chave, valor".
b) Você tem que usar um método chamado "equal_range", que volta um par de iteradores.
c) E só para deixar o exemplo um pouco mais enigmático: descubra as espécies de animais que usei para o exemplo. Wallabia bicolor é um simpático bichinho da Austrália (o wallaby), que lembra um canguru de brinquedo.
#include<map>#include<string>#include<iostream>usingnamespacestd;typedefmultimap<string,string>MMSS;typedefpair<string,string>PAIR;intmain(intargc,char*argv[]){MMSSmmss;//-- Inserindo no multimapmmss.insert(PAIR("Macropodidae","Aepyprymnus rufescens"));mmss.insert(PAIR("Macropodidae","Wallabia bicolor"));mmss.insert(PAIR("Macropodidae","Macropus agilis"));mmss.insert(PAIR("Edentata","Euphractus sexcinctus"));mmss.insert(PAIR("Didelphidae","Didelphis marsupialis"));mmss.insert(PAIR("Didelphidae","Philander opossum"));mmss.insert(PAIR("Didelphidae","Didelphis virginiana"));//-- Listando o "multimap". Isto é parecido com o seguinte código Java:// for (Map.Entry<String,String> entry : mmss.entrySet()) {// System.out.println (entry.getKey() + "," + entry.getValue());// }// Você pode ver que o multimap é como se fosse um TreeMap <String, ArrayList ><String> >cout<<"Listandoomultimap"<<endl;for(MMSS::const_iteratorit=mmss.begin();it!=mmss.end();++it){cout<<it->first<<","<<it->second<<endl;}cout<<"."<<endl;//-- Listando os elementos da chave "Macropodidae".cout<<"ListandoapenasosMacropodidae"<<endl;pair<MMSS::const_iterator,MMSS::const_iterator>macropodidae=mmss.equal_range("Macropodidae");for(MMSS::const_iteratorit=macropodidae.first;it!=macropodidae.second;++it){cout<<it->first<<","<<it->second<<endl;}cout<<"."<<endl;}