exemplo de uso do map e vector em C++

Iniciado por Diego_Rocha, 12 de Agosto de 2007, 16:30

tópico anterior - próximo tópico

Diego_Rocha

Pra quem naum conhece o map e o vector do C++ aqui vai um exemplo,



#include <iostream>
#include <map>
#include <vector>
#include <string>

int main(){
   std::map< std::string, std::string > MyMap; //aqui criamos o map
   /*aqui criamos o iterator do map para podermos navegar pelo mapa */
   std::map< std::string, std::string >::iterator MyIterMap;
   std::vector< std::string > MyVector; //criamos o vetor
   /*aqui iniciamos o iterator pro vetor lembrando que sempre o iterator tem q ser igual o vetor entaum se seu vetor é std::vector<int> o iterator tbm tem q ser std::vector<int>::iterator de int*/
   std::vector< std::string >::iterator MyIterVector;
   MyVector.push_back("vetor1");
   MyVector.push_back("vetor2");
   MyVector.push_back("vetor3");/* aqui adicionas no final do vetor os valores*/
   MyMap["Teste1"] = "map1";
   MyMap["Teste2"] = "map2";
   MyMap["Teste3"] = "map3";/*aqui adiconamos valores no mapa*/
/*agora vamos imprimir os conteudos do vetor e do mapa usando os iteratores */

   MyIterVector = MyVector.begin(); //aqui colocas o iterator no começo do vetor
   MyIterMap = MyMap.begin(); //aqui a mesma coisa
   while( MyIterVector != MyVector.end() ) /* enquanto o iterator for diferente do final do vetor ele vai imprimir o resultado */
   {
      std::cout << *MyIterVector<<std::endl;
      MyIterVector++; //aqui passamos o iterator pra proxima posição
   }
   while( MyIterMap != MyMap.end() ) //aqui a mesma coisa
   {
   /* aqui pegamos o primeiro valor do map ou seja o valor MyMap["teste1"] esse valor pra podermos imprimir seu valor que é "map1" */
   std::string values = (*MyIterMap).first;
   std::cout <<  MyMap[values] <<std::endl;
   MyIterMap++;
   }
   return 0;
}

resultado

vetor1
vetor2
vetor3
map1
map2
map3


Agora vcs devem estar se pergutando eu posso usar um map com vetor a resposta é sim voce pode usar um std::map< std::string, std::vector<std::string> > que é um mapa de vetor de string, pode tbm usar uma mapa de vetor de struct, e pode usar ate um mapa de mapa de vetor de string mais isso voce tem que descobrir como fazer sozinho ;) pode usar template tbm pra ter mapas e vectores que possam assumir varios tipos, só pra naum deixar na curiosidade aqui vai um exemplo de mapa de vetor de struct


#include <iostream>
#include <map>
#include <vector>
#include <string>

struct di
{
std::string query;
int length;
};

int main()
{
std::map< std::string, std::vector< di > > teste;
std::map< std::string, std::vector< di > >::iterator iter;
std::vector< di >::iterator viter;

di diego;
diego.query ="diego";
diego.length = strlen("diego");

teste["teste1"].push_back( diego );

std::cout << teste["teste1"][0].length <<std::endl;

diego.query = "rocha";
diego.length = strlen("rocha");

teste["teste2"].push_back( diego );

iter = teste.begin();
while( iter != teste.end())
{
std::string valor = (*iter).first;
viter = teste[valor].begin();
while( viter != teste[valor].end())
{
std::cout << (*viter).query <<" "<<(*viter).length<<std::endl;
viter++;
}
iter++;
}
return 0;
}

resultado

5
diego 5
rocha 5


é isso ae espero q ajude alguem t++

Darcamo

A STL é extremamente poderosa e por ser feita com templates você pode usar com qualquer coisa.
Usei map mesmo apenas uma vez. Tinha uma enumeração indicando possíveis modulações (BPSK, 4PSK, 16QAM, 64QAM, etc) e queria guardar em uma mapa cada valor possível da enumeração e quantos bits tem em cada símbolo da modulação.
Bom, o que interessa é que eu queria associar duas coisas diferentes e únicas. Depois coloquei cada par em um vetor.

Diego_Rocha

quanto mais conheço C++ mais surpreso fico, map vetor lista stack etc... são coisas q me encanta xD, semana passada descobri o boost e to adorando estudar ele, pricipalmente os codigos fontes e os exemplos que vem com ele, o boost usa e abusa de templates e é justamente os templates q eu estou estudando agora, é isso ae C++ rulz ;)