[C con Clase] Saludos !!! - Cómo eliminar objetos de vector y agregarlos a otro vector.

Jose Roberto joser1993 en gmail.com
Dom Jul 20 21:01:31 CEST 2014


Buenos días Miguel, me alegra que acertara un poco a la respuesta al problema.

En ese código que envíe, da igual el orden en que lo pones, ya que el objeto como tal es almacenado en una variable auxiliar y no se elimina de la memoria

Pues el problema continua en la eliminación y eso va a depender de acuerdo a como trabaje la librería que estés utilizando. Pero si el método que tienes destruye todo al final, no es de extrañarse que cuando quieras mostrar los valores que contiene el vector estuvieran vacíos o no existieran. 

Vector<Shared_Ptr<Obj>> vectorNuevo(){
Vector<Shared_Ptr<Obj>> vec=generaVector(); 
Vector<Shared_Ptr<Obj>> nuevo;
Vector<Shared_Ptr<Obj>>::iterator it;
for(it=vec.begin();it!=vec.end();it++){
if(probarObjeto(*it)){ // metodo probarObjeto ira de acuerdo a lo que necesites validar para agregar una instancia al nuevo vector
nuevo.push_back(*it);
vec.erase(it);
}
}
EliminarVector(vec); // metodo para destruir el vector y su contenido
return nuevo;
}

Prueba crear un método que únicamente destruya todo y en la ejecución del programa lo llamas hasta el final, con eso separas muy bien la funcionalidad del método, ya que la idea de cualquier método es que realice una única función lógica. Es decir, si tienes un método para generar un vector, lo único que debería hacer es eso, y si deseas ordenar un vector, eso seria un método aparte. Con esto cada función queda separada y es mas practico de probar, ademas de ser una recomendable practica para programar.

Ahora bien, el uso de una variable local es posible generarlo dentro del método, así que también puede ser de ayuda para ir probando o haciendo debugging en el código. Y con la ayuda del código separado por métodos, ya seria mas rápido de descubrir el error. Pero como mencione, si eliminas todo al final del método y si lees el vector nuevo que probablemente lo hayas llenado con los punteros del vector viejo y no se había realizado la eliminación pertinente, lo cual daría un vector nuevo con punteros que apuntan a NULL o algo parecido. Con tan solo aplicar la misma idea del código que había enviado, debería bastar para solucionar el problema.

Erl 20/07/2014, a las 02:40 a.m., Miguel Ángel Torres Fernández-Píñar<miguelangeltorresfp en gmail.com> escribió:

> Buenos días Jose Roberto y muchas gracias por tu respuesta.
> 
> Supongo que en tu ejemplo tendría que ser :
> 
> nuevo.push_back(obj);
> vec.erase(it);
> 
> Creo que lo pusistes al revés de cómo me decías, no ???
> 
> Profundizo un poco más en el problemas.
> En los contenedores estoy guardando objetos del tipo :
> Shared_Ptr<Obj> . Pero usando una clase punteros de mi profe, no la que viene con C++ 11.
> Así que creo que no me sirve lo de crearme una variable local porque de igual modo, al estar todo esto metido en un método, al final del método se destruye todo.
> 
> Uf, no sé, estoy hecho un lío, pero sí, el tema va por donde tú dices Jose Roberto.
> 
> Muchas gracias.
> 
> 
> El 20 de julio de 2014, 5:43, Jose Roberto <joser1993 en gmail.com> escribió:
> Probablemente estes usando el mismo objeto que tiene el iterador que recorre el primer vector y estes eliminando el contenido del iterador antes de agregar el objeto al segundo vector. Es decir, que estes eliminando el objeto una vez que lo eliminas del vector. Si este es el caso, considera guardar el objeto en una variable auxiliar y usala para agregar ese objeto al segundo vector, eso seria lo mas didactico. Pero lo considerable es que si consigues un objeto que debas agregar al otro vector, se deberia agregar primero el objeto y despues eliminarlo del vector original.
> 
> Espero que con este codigo se entienda un poco mas la idea
> 
> #include <vector>
> #include <iostream>
> 
> using namespace std;
> 
> 
> int main(){
> 	vector<int> vec;
>         for(int i=0; i<6; i++){
>                 vec.push_back(i);
>         }
> 
> 	vec<int> nuevo;
>         vec<int>::iterator it;
>         int obj; // Este ejemplo consideremoslo como objetos tipo int
>         for(it=vec.begin(); it!=vec.end();it++){
>                 obj=*it;
>                 if(obj%2==0){
>                         vec.erase(it);
>                         nuevo.push_back(obj);
>                 }
>         }
> 
> 	for(it=nuevo.begin(); it!=nuevo.end(); it++){
>                 cout<<*it<<endl;
>         }
> }
> 
> Saludos
> 
> 
> El 19 de julio de 2014, 20:36, Facundo Curti <facu.curti en gmail.com> escribió:
> 
> El día 19 de julio de 2014, 23:16, Miguel Ángel Torres Fernández-Píñar
> <miguelangeltorresfp en gmail.com> escribió:
> > Hola, saludos a todos.
> >
> > Recorre un contenedor de objetos mediante iteradores.
> >
> > Elimino sin problemas un elemento de este contenedor.
> >
> > Pero mi problema viene cuando quiero agregar justo este elemento a otro
> > contenedor.
> >
> > No sé cómo hacer esto.
> >
> > Se agrega pero luego el programa falla por algún problema de memoria.
> >
> > No sé si con estos datos del problema es suficiente.
> >
> > Gracias y saludos !!!
> >
> > _______________________________________________
> > Lista de correo Cconclase Cconclase en listas.conclase.net
> > http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> > Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
> 
> Seria bueno que subieras el código para que podamos ayudarte.
> Seguramente estas escribiendo fuera de los limites. No puedes guardar
> 2 litros de agua en una botella de 500cc. Seguramente lo mismo estas
> haciendo con el arreglo. De ser así, tendrías que ver de asignarle
> memoria con malloc.
> Repito, seria bueno que colocaras el código, así podremos ayudarte.
> 
> Saludos! ;)
> 
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
> 
> 
> 
> -- 
> José Roberto
> 
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
> 
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140720/db12a0ac/attachment.html>


Más información sobre la lista de distribución Cconclase