elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [solucionado]Recorrer un map
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [solucionado]Recorrer un map  (Leído 2,090 veces)
josevc

Desconectado Desconectado

Mensajes: 15


Ver Perfil
[solucionado]Recorrer un map
« en: 22 Mayo 2015, 19:31 pm »

Buenas,

class Persona{
 public:
             ....
 private:
          typedef map<Asignatura*, int>Asignaturas;
          Asignaturas asignaturas;
          ...
};


Un map como este lo podría recorrer de la siguiente forma:

void mostrarAsignaturas()
{
     for(Persona::Asignaturas::const_iterator i=asignaturas.begin(); i!=asignaturas.end(); i++)
            (i->first)->mostrar(); cout << i->second << endl;
}

*Teniendo la clase asignatura un método mostrar.


El problema es si complicamos esto un poco más y queremos imprimir el siguiente map:

typedef std::map<Empresa*, std::map<Persona*,Salario*> > AD;
AD empresa-empleado;


Quiero hacer lo mismo que antes, un metodo mostrar que dado una Empresa te devuelva todas las personas con sus respectivos salarios.  :rolleyes:

Pero no se como podría hacer algo así, no se como recorrer el map interno.

Espero que alguien pueda ayudarme,
Muchas gracias!




« Última modificación: 23 Mayo 2015, 20:34 pm por josevc » En línea

Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Recorrer un map
« Respuesta #1 en: 22 Mayo 2015, 23:52 pm »

Respecto a tu primer recorrido, si utilizas C++11, lo más fácil es hacerlo de la siguiente forma:

Código
  1. void mostrarAsignaturas()
  2. {
  3.    for (const auto & i : asignaturas) { // Son dos sentencias. Necesitas las llaves!!!
  4.       i.first->mostrar();
  5.       cout << i.second << endl;
  6.   }
  7. }

Respecto al recorrido del map interno:

Código
  1. void mostrarAsignaturas(Empresa* e)
  2. {
  3.    for (const auto& i : empresa_empleado[e]) {
  4.        i.first->mostrar();
  5.        i.second->mostrar();
  6.   }
  7. }

A la vieja usanza (sin los `based-range for` ni `auto`s), sería:

Código
  1. void mostrarAsignaturas(Empresa* e)
  2. {
  3.    const AD& empleados_e = empresa_empleado[e];
  4.  
  5.    for (AD::const_iterator i = empleados_e.begin(); i != empleados_e.end(); ++i) {
  6.        i->first->mostrar();
  7.        i->second->mostrar();
  8.   }
  9. }

Otra variante (con `auto`s pero sin `based-range for`):

Código
  1. void mostrarAsignaturas(Empresa* e)
  2. {
  3.    const auto& empleados_e = empresa_empleado[e];
  4.  
  5.    for (auto i = empleados_e.begin(); i != empleados_e.end(); ++i) {
  6.        i->first->mostrar();
  7.        i->second->mostrar();
  8.   }
  9. }

Los `auto`s lo que hacen es deducir el tipo (aunque siempre deducen el valor por copia; si lo que quieres es una referencia, tienes que forzarla escribiendo `&` junto a `auto`; y si la referencia la quieres constante, pues pones también `const`).

Un `range-based for` como el siguiente (supongamos que `v` es un `vector<int>` no constante):

Código
  1. for (auto i : v) {
  2.   /* codigo */
  3. }

Sería equivalente a lo siguiente:

Código
  1. // `it` tiene tipo `vector<int>::iterator`
  2. for (auto it = v.begin(); it != v.end(); ++it) {
  3.   auto i = *it; // `i` tiene tipo `int`.
  4.   /* codigo */
  5. }

Y si fuera por referencia:


Código
  1. // `it` tiene tipo `vector<int>::iterator`
  2. for (auto it = v.begin(); it != v.end(); ++it) {
  3.   auto& i = *it; // `i` tiene tipo `int&`.
  4.   /* codigo */
  5. }

Espero que con todo ésto, te haya quedado claro como se recorren rangos :)


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Recorrer Archivos
Programación Visual Basic
el_chente23 4 2,929 Último mensaje 27 Agosto 2007, 00:23 am
por lupino666
Recorrer una table
Programación General
sasj13 1 3,623 Último mensaje 24 Junio 2010, 13:22 pm
por jlrvpuma
Recorrer dataGrid
.NET (C#, VB.NET, ASP)
proteus8 6 8,363 Último mensaje 25 Febrero 2011, 16:00 pm
por .::IT::.
Recorrer Winsock
Programación Visual Basic
Stelio Kontos 1 1,781 Último mensaje 24 Marzo 2011, 13:53 pm
por skyweb07
Recorrer Array
Programación C/C++
cobolitros 2 2,796 Último mensaje 7 Julio 2011, 21:08 pm
por leogtz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines