Método eficiente de armazenamento utilizando containers (Vector e Map)

Publicado por Robson Lopes (última atualização em 20/12/2009)

[ Hits: 7.326 ]

Download pessoa.cpp




Para quem deseja um exemplo de containers sendo utilizado com uma classe própria, esse será um bom exemplo.

  



Esconder código-fonte

/*
* Nome: Robson Lopes
* Nick: Rob_Som
* Linguagem: C++
* Titulo: Método eficiente de Armazenamento, utilizando containers(Vector, Map, string).
* Objetivo: Cadastrar pessoas em ordem alfabética com eficiencia O(log(n))
*/
#include <iostream>
#include <vector>
#include <map>
#include <string>

using std::map;
using std::vector;
using std::string;
using std::cin;
using std::cout;
using std::endl;

class Pessoa{
  private:
    /*Atributos*/
    string Nome;
    string Sobrenome;
    int Idade;
   
  public:
    Pessoa(string , string , int ); //Construtor
    
    /*Funções membros*/
    void setNome(string n){ this->Nome = n; }
    void setSobrenome(string s){ this->Sobrenome = s; }
    void setIdade(int i){ this->Idade = i > 0 ? i : 1; } //validação
    string getNome() const { return this->Nome; }
    string getSobrenome() const { return this->Sobrenome; }
    int getIdade() const { return this->Idade; }
    void PrintPessoa() const;
};

Pessoa::Pessoa(string n, string s, int i){
  this->setNome(n);
  this->setSobrenome(s);
  this->setIdade(i);
}

void Pessoa::PrintPessoa() const {
  cout << "Nome: " << this->getNome() << endl;
  cout << "Sobrenome: " << this->getSobrenome() << endl;
  cout << "Idade: " << this->getIdade() << endl;
}

int main(void){
  /*Na Chave utilizo container string. Para o Valor utilizo o container vector armazenando um
  * objeto do tipo Pessoa. */
  map< string, vector<Pessoa> > Mymap;
  /*Iterator para correr o container map. Lembrando que será ordenado pela chave(nome completo).
  * Fique tranquilo, que o map se encarregará disso. */
  map< string, vector<Pessoa> >::iterator itM;
  /*Iterator para acessar o container Vector que possui o Objeto Pessoa */
  vector<Pessoa>::iterator itV;
  
  int opcao, idade;
  string nome, sobrenome, completo, chave;
  
  do{
    cout << "1. Para Adicionar" << endl;
    cout << "2. Para Lista" << endl;
    cout << "3. Para Sair" << endl;
    cout << "Opção: ";
    cin >> opcao;
    
    if(opcao == 1){
      cout << endl << "Digite o Nome: ";
      cin >> nome;
      cout << "Digite o Sobrenome: ";
      cin >> sobrenome;
      cout << "Digite a Idade: ";
      cin >> idade;
      completo = nome + sobrenome;
      Pessoa *A = new Pessoa(nome, sobrenome, idade);
      Mymap[completo].push_back(*A);
    }
    else if(opcao == 2){
      cout << endl;
      for(itM = Mymap.begin(); itM != Mymap.end(); itM++){
   /*(*itM).first eu pego a chave e begin() é a primeira posicão do Vector */
   itV = Mymap[(*itM).first].begin(); 
   itV->PrintPessoa();
   cout << endl;
      }
    }
  }while(opcao != 3);
  
  return 0;
}

Scripts recomendados

merge sort

Desenhando uma superfície Bézier

Função Hash básica

Ordenação de dados

Pilha usando lista encadeada


  

Comentários
[1] Comentário enviado por andrezc em 22/12/2009 - 21:42h

Maneiro, ficou bem completo o seu código. Mas ele tem um bug, por exemplo, se você digitar uma letra ao invez de um número ( opção ) o programa vai dar vários loops ( como um return main() ) só que bem mais rápido e descontrolado. O que você tem a fazer é fazer com que ele leia como string e verifique se a string que ele digitou está bem formatada ou não, e aja de acordo com o resultado dessa verificação,, daí é só usar a criatividade e colocar algo como

std::cerr << "Por favor, selecione uma opcao valida.\n";

[2] Comentário enviado por rob_som em 22/12/2009 - 22:47h

Com certeza amigo. Obrigado pela observação!!!
Eu fiz meio que pra mostrar como funciona o uso de containers com uma classe própria, e me esqueci desse porém.


Obrigado.

[3] Comentário enviado por dinhoo122 em 30/05/2010 - 01:47h

Cara adorei esse programa.
Mas como eu poderia fazer pra mudar ordem alfabetica em vez de começar por A depois B e depois C e assim por diante para Z, Y, W, ...?

[4] Comentário enviado por rob_som em 01/06/2010 - 16:01h

Olá dinhoo122,

Que bom que tenha gostado.
Para inverter a ordem alfabética de trás para frente mude as seguintes linhas:

map< string, vector<Pessoa> >::iterator itM;
Para
map< string, vector<Pessoa> >::reverse_iterator itM;

E

for(itM = Mymap.begin(); itM != Mymap.end(); itM++)
Para
for(itM = Mymap.rbegin(); itM != Mymap.rend(); itM++)

Tomara que ajude.
Abraços


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts