STL: Combinando uso de map, string y vector

Iniciado por david_BS, 8 Mayo 2012, 02:26 AM

0 Miembros y 1 Visitante están viendo este tema.

david_BS

Hola, voy a postear un ejemplo en el que se muestra el uso de map y vector, para lograr un manejo de datos, en este caso, de nombres de elementos almacenados y obtener su número de identificador. Para el vector se usa una struct con dos miembros, uno el nombre del elemento y otro el identificador. También se usa un puntero a un registro de tipo struct 'PrivateData', con el cual podemos hacer uso de los métodos de map y string. La idea de este código pertenece al proyecto OGC pero lo que he tratado de hacer es "aislar" el método para demostrar su uso con un ejemplo.

Dejo el proyecto para descargar:
http://www.mediafire.com/?4sawtvs9czbd17s

En este ejemplo no se usan los defines pero están para mayor comodidad

#define INDEXFIND_BY_ID   (((PrivateData*)my_data)->findByID)
#define INDEXFIND_BY_NAME (((PrivateData*)my_data)->findByName)



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// UTN FRGP TSP
// BS
// mail: david_bs@live.com
// web: Etalking.Com.Ar
// 2012
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include <stdio.h>

#include <fstream.h>
#include <map>
#include <string>
#include <vector>

using namespace std;

typedef map<int,int> MapIntInt;

struct PrivateData{
MapIntInt findByID;
string findByName;
};

void* my_data;

#define INDEXFIND_BY_ID   (((PrivateData*)my_data)->findByID)
#define INDEXFIND_BY_NAME (((PrivateData*)my_data)->findByName)

struct Info
{
char szName[36];
int iId;
};

vector<Info> infoList;

void Constructor()
{
my_data = new PrivateData;
}

void Destructor()
{
   delete (PrivateData*)my_data;
}



void Completa(int id, const char* name){

Info newElemento;

strcpy( newElemento.szName, name );
newElemento.iId = id;

// find: retorna un iterator
MapIntInt::iterator foundpos = (((PrivateData*)my_data)->findByID).find( newElemento.iId );

typedef MapIntInt::value_type Entry;

if(foundpos==((((PrivateData*)my_data)->findByID).end())) // al final (luego del último elemento)
{
int index = infoList.size();
infoList.push_back(newElemento);
(((PrivateData*)my_data)->findByID).insert(Entry(newElemento.iId,index)); // inserta elemento nuevo
(((PrivateData*)my_data)->findByName).assign(newElemento.szName);
}
else //repite
{
int index = foundpos->second; // un par tiene un segundo elemento..
infoList[index]=newElemento;
}
}


Con esta función accedemos a los nombres almacenados en el vector

const char* getNamebyId(int id)
{
MapIntInt::iterator foundpos = (((PrivateData*)my_data)->findByID).find( id );
if(foundpos==((((PrivateData*)my_data)->findByID).end())) { return "ninguna"; }
int index = foundpos->second;
return infoList[index].szName;
}



int main(){

Constructor();
Completa(0, "AK");
Completa(0, "SCOUT");
Completa(1, "AP");
Completa(2, "DESERT");

Completa(1, "M4");
Completa(1, "M4");
Completa(1, "M4");

cout << "La id 0 contiene: " << getNamebyId(0) << endl;
cout << "La id 1 contiene: " << getNamebyId(1) << endl;
cout << "La id 2 contiene: " << getNamebyId(2) << endl;


cin.get();
Destructor();
return 0;
}