Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Usar vector de mapas

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Usar vector de mapas Responder citando

Hola, necesito guardar la siguiente estructura de datos:

ID1 - (tiempo1_1, acceso1_1) - (tiempo1_2, acceso1_2) - ...
ID2 - (tiempo2_1, acceso2_1) - (tiempo2_2, acceso2_2) - ...

de modo que al inicio del programa desconozco cuántos ID voy a tener. Además cada secuencia de pares en IDx puede estar formado por un número diferente de pares de datos (se trata de una especie de matriz dentada, no es una matriz propiamente dicha pues el número de elementos de cada fila no es constante).

Para gestionarlo he pensado en utilizar
Código:
std::vector< std::map<TDateTime, String> > vSesiones;
pero no encuentro el modo de gestionarlo.

¿Cómo añado una nueva "fila" IDx - (tiempoX_1, accesoX_1)?

¿Cómo puedo añadir un nuevo par (tiempoX_n, accesoX_n) a IDx cuando ya existe la fila IDx?

Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

te paso esto estoy de prisa

Código:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <vector>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-----------------------------
class TPar{
public:
    TTime t;
    AnsiString s;
    TPar(TTime x,AnsiString z){t=x;s=z;};
    TPar(){};

} ;
typedef std::vector<TPar*>vPar;
std::vector<vPar*> obj;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   vPar *Entrada= new vPar();
   Entrada->push_back( new TPares(Time(),"Hola 1") );
   Entrada->push_back( new TPares(Time(),"Hola 2") );
   Entrada->push_back( new TPares(Time(),"Hola 3") );
   obj.push_back(Entrada);
   TPares *Salida = obj[0]->front();
   this->Caption = Salida->s;
}
//---------------------------------------------------------------------------

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Bien, el codigo anterior, tiene un fallo, este esta correcto..
saludos..

Código:

#pragma resource "*.dfm"
TForm1 *Form1;
//-----------------------------
class TPares{
public:
    TPares(TTime T,AnsiString S): t(T), s(S){};
    TPares(){};
    virtual ~TPares(){};
    TTime t;AnsiString s;
};
typedef std::vector<TPares*> vPar;
std::vector<vPar>obj;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{

    obj.push_back();// crear un obj
    obj[0] = vPar();// asignar tipo de datos
    obj[0].push_back(new TPares(Time(),"hola1") );//0
    obj[0].push_back(new TPares(Time(),"hola2") );//1
    obj[0].push_back(new TPares(Time(),"hola3") );//2
    obj[0].push_back(new TPares(Time(),"hola4") );//3
    obj[0].push_back(new TPares(Time(),"hola5") );//4

    obj.push_back();// crear otro  obj
    obj[1] = vPar();// asignar tipo de datos
    obj[1].push_back(new TPares(Time(),"hola 11") );//0
    obj[1].push_back(new TPares(Time(),"hola 12") );//1
    obj[1].push_back(new TPares(Time(),"hola 13") );//2
    obj[1].push_back(new TPares(Time(),"hola 14") );//3
    obj[1].push_back(new TPares(Time(),"hola 15") );//4

    //etiqueta para mostrar
    this->Label1->Caption = obj[0][2]->t  ; //obj[0]    Time()
    //etiqueta para mostrar
    this->Label2->Caption = obj[1][4]->s  ; //obj[1]   "hola 15"
}
//---------------------------------------------------------------------------



Espero este si te sirva.. saludos..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola. Ante todo gracias, me ha servido, pero me hago una pregunta ¿porqué utilizar punteros y el operador new en vectores, que realmente conocen el tipo de datos que contienen y además nos liberan de las secuencias new ... delete? De hecho tu código funciona bien pero me obliga a borrar los elementos que he creado (y concretamente, como no les has dado nombre a algunos de ellos no sé cómo borrarlos y CodeGuard no perdona esa falta).

Mira qué te parece este código, no utilizo punteros ni new ni delete:
Código:
TForm1 *Form1;
//---------------------------------------------------------------------------
class TPar{
public:
   TTime t;
   AnsiString s;
   TPar(TTime x, AnsiString z){t=x; s=z; };
   TPar(){};
};
typedef std::vector<TPar> tipo_vector_pares;
typedef std::vector<tipo_vector_pares> tipo_vector_vectores;
tipo_vector_vectores vvTabla;
tipo_vector_pares vEntrada;
TPar par;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   par.t = Time();
   par.s = "Hola 3";
   vEntrada.push_back(par);

   par.t = Time();
   par.s = "Hola 2";
   vEntrada.push_back(par);

   par.t = Time();
   par.s = "Hola 1";
   vEntrada.push_back(par);

   vvTabla.push_back(vEntrada);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   if (vvTabla[0].size() == 0)
      ShowMessage("¿Ande vás?");
   else
      {
      //Puntero al último elemento del primer vector de pares
      TPar *Salida = vvTabla[0].end() - 1;
      this->Caption = TimeToStr(Salida->t) + " - " + Salida->s;
      //Eliminamos el último elemento del vector
      vvTabla[0].pop_back();
      }
}
//---------------------------------------------------------------------------
¿Sabes qué versión es "mejor"? Voy a trabajar con vectores grandes (de momento más de 100.000 pares repartidos en varios miles de vectores).

Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Te recomiendo usar, la version nueva que acabo de pasar, ya que si piensas utilizar, muchos arreglos, es mejor utilizar punteros, para hacerlos dinamicos, y asi no tener problemas, con la memoria,

tu pregunta y problema esta resuelto..

saludos

espero que te hayan servido los codigos..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Pero, por lo poco que he leído sobre vectores (y sobre la STL), si los uso no voy a tener problemas con la cuestión de reserva y liberación de memoria a menos que se desborde la memoria, claro. Los vectores son dinámicos de por sí.

¿Has probado tu último código con el CodeGuard vigilando? ¿Cómo resuelves los errores que te apunta?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

una ultima pregunta, tu programa, dependerá del CodeGuard, ejecutandosé?

Saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.