¿Cómo eliminar un elemento de una matriz de estructura que tiene punteros?
Frecuentes
Visto 3,051 equipos
3
Esta es mi estructura que tiene dos punteros enteros aV y aT.
struct ADJP
{
int *aV;
int eV;
int nV;
int *aT;
int nT;
};
ADJP *Umb = NULL;
El proceso de asignación de aV y aT es así...
for(int i=0; i<nb; i++)
{
Umb[i].aV = new int[N];
for(int j=0; j<n; j++)
Umb[i].aV[j] = pIn[i].aV[j];
}
Quiero eliminar un elemento específico de la matriz Umb. por ejemplo, quiero eliminar Umb[5], entonces, ¿cómo puedo eliminarlo? Lo intenté con varios métodos, pero creo que obtuve un error debido a los punteros asignados. Lo he intentado con el método de seguimiento, pero no funciona con este tipo de matriz de estructura. Está trabajando con una matriz de estructura que no tiene punteros.
int DeleteStructElement(int Index, ADJP *b, int N, int at)
{
for(int i=Index; i<N-1; i++)
memmove(&b[i], &b[i+1], (N-at-1)*sizeof*b); // moving the terms of array
N--; // updating new size
return N;
}
¿Tiene alguna idea de cómo eliminar un elemento de mi matriz de estructura?
3 Respuestas
2
Deberá eliminar las matrices en el elemento eliminado para liberar su memoria:
delete[] b[Index].aV;
delete[] b[Index].aT;
Luego, solo tiene que hacer un solo movimiento de memoria para eliminar el elemento.
memmove(&b[Index], &b[Index+1], (N-Index-1) * sizeof(b[Index])
EDITAR: como señala Mahmoud, esto no usa el at
parámetro en DeleteStructElement
; No estoy seguro de lo que pretendías que hiciera ese parámetro.
Respondido 26 ago 12, 05:08
No hizo uso del parámetro 'en' pero voté porque esta es la respuesta correcta. Dile que elimine el parámetro no utilizado. - mahmud fayez
gracias "neonneo". ¿Quiere decir que no necesito mover todos los elementos anteriores? significa que no hay necesidad de bucle for? simplemente elimine los elementos del índice y mueva la memoria del índice + 1 para indexar, ¿eso es todo? esto es lo que quieres decir? - maxpayne
Bueno, en realidad, memmove es capaz de mover más de un elemento a la vez, ya que solo mueve bloques enteros de memoria. En este caso, configuré el número de bytes (el tercer parámetro) para que mueva todos los elementos restantes. - neonneo
¿Puedes decirme también si es correcto copiar usando memcpy? así... memcpy(temp, Umb, nb*sizeof(ADJP)); en este caso, no estamos asignando memoria para temp.aV y temp.aT, entonces, ¿copiar la memoria Umb a temp es legal? - maxpayne
memcpy es incorrecto ya que, en el código original, la fuente y el destino se superponen. No veo lo que quieres lograr con temp. - JohnB
2
int DeleteStructElement (int index, ADJP * b, int nb) {
delete [] (b[index].aV);
for (int i = index; i < nb - 1; ++i) {
b[i] = b[i+1];
}
return nb - 1;
}
Respondido 26 ago 12, 08:08
Creo que tienes un error tipográfico. ¿No debería ser: delete [] b[index].aV; y probablemente también para(int i = index; i < nb - 2; ++i) - Scooter
Tienes razón con b{index]. Corregí eso. ¿Por qué i < nb - 2? - JohnB
Hmmm, no estoy seguro de por qué dije eso. No parece ahora que lo pienso. - Scooter
0
Asumiendo que realmente estás usando C++, un destructor en ADJP
sería mucho más sencillo que DeleteStructElement
.
Pero si estás haciendo una "C" interesante con new
/delete
(¿quizás un subconjunto bien confinado de C++?), entonces sugeriría llamar delete
desde adentro DeleteStructElement
.
pero obtuve un error debido a los punteros asignados, creo
Responder a esta pregunta puede ser mucho más importante que otras. ¿Supongo que esto fue un error de tiempo de ejecución? Use un depurador para descubrir exactamente dónde estaba la falla.
Respondido 26 ago 12, 05:08
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c++ c arrays data-structures or haz tu propia pregunta.
¿Nuevo es C ++ solo qué idioma está usando? - Adrian Cornish
Tu pregunta está etiquetada
C
(y noC++
), pero estás usandonew
. ¿Estás realmente limitado aC
? - Brian Cain"nuevo" es c++. Si está escribiendo C, debe usar malloc(). - Hannes Landeholm
por supuesto, c y c ++. Estoy usando Visual Studio C ++ 2010. Déjame etiquetar c ++ también.. - maxpayne