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.
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.
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!
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.
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.
[code] #include <map> #include <string> #include <iostream>
using namespace std;
int main (int argc, char *argv[]) {
MMSS mmss;
//-- Inserindo no multimap
mmss.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 << “Listando o multimap” << endl;
for (MMSS::const_iterator it = mmss.begin(); it != mmss.end(); ++it) {
cout << it-> first << “,” << it-> second << endl;
}
cout << “.” << endl;
//-- Listando os elementos da chave “Macropodidae”.
cout << “Listando apenas os Macropodidae” << endl;
pair<MMSS::const_iterator, MMSS::const_iterator> macropodidae = mmss.equal_range (“Macropodidae”);
for (MMSS::const_iterator it = macropodidae.first; it != macropodidae.second; ++it) {
cout << it-> first << “,” << it-> second << endl;
}
cout << “.” << endl;