 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Jue 18 Nov, 2004 11:46 pm Asunto: Usar vector de mapas |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 19 Nov, 2004 4:18 am Asunto: |
|
|
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;
}
//--------------------------------------------------------------------------- |
_________________
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 20 Nov, 2004 1:00 am Asunto: |
|
|
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.. _________________
 |
|
| Volver arriba |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Sab 20 Nov, 2004 1:23 am Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 20 Nov, 2004 1:27 am Asunto: |
|
|
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.. _________________
 |
|
| Volver arriba |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Sab 20 Nov, 2004 1:37 am Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 20 Nov, 2004 1:43 am Asunto: |
|
|
una ultima pregunta, tu programa, dependerá del CodeGuard, ejecutandosé?
Saludos _________________
 |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|