Iteradores C++

Una forma de recorrerlos los vectores, mapas y conjuntos sin preocuparnos por los índices o los elementos que contengan, es mediante el uso de iteradores.


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

using namespace std;

struct Persona{
    string nombre;
    int legajo;
};


map <string, vector <Persona>> cargarDatos(map <string, vector<Persona>> );

void imprimir(map <string, vector <Persona>> );

vector <Persona> obtenerPersonal(vector <Persona> );

vector <Persona> ordenarLegajos(vector <Persona> , Persona );

vector <Persona> eliminar(vector <Persona> , int );

int contarLetras(map <string, vector <Persona>> ,char);

int main(){
    
    map <string, vector <Persona>> empresa;

    empresa = cargarDatos(empresa);
    
    imprimir(empresa);
   
//--------------------------------------------------------------
    char letra;

    cout <<"Contar cantidad de nombres que comiencen por la Letra: ";cin>>letra;

    int letras;

    letras = contarLetras(empresa, letra);

    cout <<"Cantidad de Nombres que comienzan por la Letra "<<letra<<": "<<letras;

    cout<<endl;

//--------------------------------------------------------------

    cout <<"\nOrdenar Legajos: \n"<<endl;
    
    vector <Persona> area;
    
    string a;
    
    cout <<"Area a Filtrar: ";cin>>a;
    
    area = obtenerPersonal(empresa[a]);

    cout<<endl;
    
    for (auto i = begin(area); i != end(area); i++){

        cout <<"Nombre: "<<(*i).nombre<< " Legajo: "<<(*i).legajo<<endl;
    }
    
    cout<<endl;

//--------------------------------------------------------------
    int num;

    cout <<"Eliminar Legajos que finalicen con el digito: "; cin>> num;

    area = eliminar(area , num);
    
    cout<<endl;
   
    for (auto i = begin(area); i != end(area); i++){

        cout <<"Nombre: "<<(*i).nombre<< " Legajo: "<<(*i).legajo<<endl;
    }

    return 0;
}

int contarLetras(map <string, vector <Persona>> empresa,char letra){
    
    int contador = 0;

    for (auto vec: empresa){

        for( Persona persona  : vec.second){

            if (persona.nombre[0] == letra ){

                contador++;
            }
        }
    }
    return contador;
}

vector <Persona> eliminar(vector <Persona> empresa, int num){

    auto i = begin(empresa);

    while(i != end(empresa)){

        if(i -> legajo % 10 == num){

            i = empresa.erase(i);
        }

        else{
        
            i++;

        }
    }

    return empresa;
}
vector <Persona> ordenarLegajos(vector <Persona> nuevo , Persona p){

    auto i = begin(nuevo);

    while( i != end(nuevo) and i -> legajo <= p.legajo){

        i++;
    }

    nuevo.insert(i, p);

    return nuevo;
}

vector <Persona> obtenerPersonal(vector <Persona> empresa){

    vector <Persona> nuevo;

    for(auto i = begin(empresa); i != end(empresa); i++){
        
        nuevo = ordenarLegajos(nuevo, *i);

    }

    return nuevo;
}

void imprimir(map <string, vector <Persona>> empresa){

    for(auto i = begin(empresa); i != end(empresa); i++){

        cout << "***Area: " <<i -> first << "****\n" << endl;
        
        for(auto e = begin( i -> second); e != end(i -> second); e++){

            cout << "Nombre: "<<e -> nombre<<" Legajo: "<< e -> legajo<<endl;

        }

        cout <<"\n"<<endl;
    }
}

map <string, vector <Persona>> cargarDatos(map <string, vector<Persona>> contenedor){
    
    Persona persona;

    persona.nombre="Emanuel Blanco ";
    persona.legajo=19;
    contenedor["Administracion"].push_back(persona);

    persona.nombre="Claudia River";
    persona.legajo=154;
    contenedor["Administracion"].push_back(persona);

    persona.nombre="Rey Lag";
    persona.legajo=129;
    contenedor["Administracion"].push_back(persona);

    persona.nombre="Fernanda Stallaman";
    persona.legajo=124;
    contenedor["Administracion"].push_back(persona);

    persona.nombre="El noba";
    persona.legajo=69;
    contenedor["Administracion"].push_back(persona);

    persona.nombre="Alma Marcela goso";
    persona.legajo=189;
    contenedor["Administracion"].push_back(persona);

    persona.nombre="Joaquin Ramos";
    persona.legajo=426;
    contenedor["Produccion"].push_back(persona);

    persona.nombre="Ricardo Gimenez";
    persona.legajo=165;
    contenedor["Administracion"].push_back(persona);

    persona.nombre="Jessica Williams";
    persona.legajo=329;
    contenedor["Capacitaciones"].push_back(persona);

    persona.nombre="Jonathan Rojas";
    persona.legajo=253;
    contenedor["Produccion"].push_back(persona);

    persona.nombre="Julia Dominguez";
    persona.legajo=397;
    contenedor["Capacitaciones"].push_back(persona);

    persona.nombre="Rodolfo Quinteros";
    persona.legajo=562;
    contenedor["Produccion"].push_back(persona);

    return contenedor; 

}