C++ asignar dinámicamente una estructura que contiene un sindicato [vector o mapa] dos veces lleva a un error de bad_alloc.
Tengo una gran cantidad de tuplas (arreglo de enteros[N], mensaje de cadena) para almacenar. Quiero poder agregar / eliminar muchos elementos de esta matriz muy rápido, pero lo más importante, dados otro arreglo
array2, Quiero encontrar todas las cadenas de modo que para todos
i
: array[i] <= array2[i] (aún no implementado).
Por lo tanto, pensé en usar un árbol de altura N donde una hoja es un mensaje. Si es una hoja, debe contener un vector
Estoy usando una unión para administrar si un árbol es una hoja o un nodo.
Mi función de eliminación debería eliminar la hoja y todos los nodos que llevan solo a esta hoja.
Puedo insertar un mensaje (o varios mensajes diferentes). Sin embargo, no puedo volver a insertar un mensaje que eliminé previamente. Genera un error bad_alloc.
```cpp
#include
#include
davy.ai
Solución
La implementación proporcionada utiliza una estructura de árbol para almacenar tuplas de
(int array [N], string mensaje)
y permite una rápida inserción, eliminación y búsqueda. El árbol tiene una altura N, y cada nodo hoja contiene una cadena de mensaje, mientras que cada nodo no hoja contiene un mapa que asocia índices de matriz con sus nodos secundarios correspondientes.La función
erase
elimina un nodo hoja y todos los nodos no hoja que lo preceden, siempre y cuando la ruta no tenga otro nodo hoja. Para ello, primero encuentra el nodo hoja usando la entradaarray
de índices, y luego encuentra todos los nodos no hoja que lo preceden mientras los almacena en un vector. Luego elimina el nodo hoja y verifica cada nodo no hoja para ver si tiene otros nodos secundarios. Si no lo tiene, elimina el nodo y continúa subiendo por el vector hasta llegar a la raíz del árbol.El programa se bloquea debido al uso de
map.~map ()
ymsg.~vector ()
en el constructor deNode
. Estas líneas deben eliminarse ya que están invocando el destructor de los objetosmap
yvector
, respectivamente, lo cual no es necesario y puede causar un comportamiento indefinido. El constructor simplemente puede inicializar el vectormsg
y el mapa se puede inicializar más adelante en el constructor por defecto.