Hola amigos, estoy con el siguiente dilema, estoy trabajando sobre un grafo con nodos conectados entre sí. Y creé una clase llamada así, "SuperNodos":
Código C++:
Ver originalclass SuperNode{
private:
int _id;
int _alias;
int _level;
int _pos;
vector<vector<SuperNode*>> _roadtoit;
vector<SuperNode*> _Neighbor;
public:
SuperNode(){ ; }
SuperNode(int id, int alias, int level, int pos){ _id = id, _alias = alias, _level = level, _pos = pos; }
void add_Neighbor(SuperNode &n){ _Neighbor.push_back(&n); }
void add_roadtoit(vector<SuperNode*> &n){ _roadtoit.push_back(n); }
int get_id(){ return _id; }
int get_alias(){ return _alias; }
int get_level(){ return _level; }
int get_pos(){ return _pos; }
void set_pos(int i){ _pos = i; }
SuperNode* get_oneinroad(int row, int col){ return _roadtoit[row][col]; }
void set_oneinroad(int row, SuperNode &i){ _roadtoit[row].push_back(&i); }
vector<SuperNode*> get_roadtoit(int i){ return _roadtoit[i]; }
SuperNode get_neighbor(int i){ return *_Neighbor[i]; }
};
Como ven tiene algunos métodos y sus atributos el importante para la pregunta es el
Código C++:
Ver originalvector<vector<SuperNode*>> _roadtoit;
. Que es un vector de punteros que apuntan a unos SuperNodos.
En el main inicializo un vector de Nodos, llamado "s";
Código C++:
Ver originalint main(){
n = lectraDedatos(); // lee los datos y lee cuantos nodos hay n
vector<SuperNode> s (n); // se crea con un vector con n nodos
//aquí va un for muy largo.
return 0;
}
La cuestión es que cada nodo de
s tiene su información y eso, en el
_roadtoit él guarda todos los posibles caminos para llegar a ese nodo, con punteros a nodos del vector
s.
Dentro del for muy largo, luego de recorre el grafo, adiciono nodos ficticios a s con un pushback (quedando más de
n claro). Pero me dí cuenta que como el vector estaba a su maxima capacidad,
<vector> muda a otro sector de memoria donde si alcanza y le da una capacidad mayor al size, eso está bien, pero ahora lodos los punteros (cada componente de
_roadtoit) que apuntaban a
s, quedan apuntando a un lugar de memoria donde ya no hay nada. Cómo puedo evitar eso o bien actualizar a dichos punteros?
Muchas gracias,
--------------ejemplo claro---------------
Código C++:
Ver original#include <iostream>;
#include <vector>;
using namespace std;
int main() {
int i = 0;
vector<int> v(10,50);
int *p = &v[0];
cout << "Dirección del puntero: " << p << endl;
cout << "contenido del puntero: " << *p << endl << endl;
v.push_back(100);
cout << "Dirección del puntero: " << p << endl;
cout << "contenido del puntero: " << *p << endl << endl;
int *p2 = &v[0];
cout << "Dirección del puntero 2: " << p2 << endl;
cout << "contenido del puntero 2: " << *p2 << endl << endl;
cin.get();
return 0;
}
El puntero
p se pierde una vez se muda vector.