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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  STL: Combinando uso de map, string y vector
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: STL: Combinando uso de map, string y vector  (Leído 1,706 veces)
david_BS

Desconectado Desconectado

Mensajes: 99



Ver Perfil WWW
STL: Combinando uso de map, string y vector
« en: 8 Mayo 2012, 02:26 am »

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
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;
}


« Última modificación: 8 Mayo 2012, 02:31 am por david_BS » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines