Dejo el proyecto para descargar:
http://www.mediafire.com/?4sawtvs9czbd17s
En este ejemplo no se usan los defines pero están para mayor comodidad
Código:
#define INDEXFIND_BY_ID (((PrivateData*)my_data)->findByID)
#define INDEXFIND_BY_NAME (((PrivateData*)my_data)->findByName)
Código:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// 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;
}
Código:
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
Código:
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;
}
Código:
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;
}