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

Miguel Ángel Torres Fernández-Píñar miguelangeltorresfp en gmail.com
Mar Jul 22 11:04:51 CEST 2014


Buenos días Jose.

Voy a seguir investigando sobre esto para ver si puedo solucionarlo o al
menos comentar el problema de una forma más concreta.

Muchas gracias por tus respuestas.




El 20 de julio de 2014, 21:01, Jose Roberto <joser1993 en gmail.com> escribió:

> 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
>
>
> _______________________________________________
> 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/20140722/684af9ed/attachment.html>


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