Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/09/2016, 14:59
dmorill
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Vector de punteros cuando muda a otro lado

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 original
  1. class SuperNode{
  2. private:
  3.     int _id;
  4.     int _alias;
  5.     int _level;
  6.     int _pos;
  7.     vector<vector<SuperNode*>> _roadtoit;
  8.     vector<SuperNode*> _Neighbor;
  9. public:
  10.     SuperNode(){ ; }
  11.     SuperNode(int id, int alias, int level, int pos){ _id = id, _alias = alias, _level = level, _pos = pos; }
  12.     void add_Neighbor(SuperNode &n){ _Neighbor.push_back(&n); }
  13.     void add_roadtoit(vector<SuperNode*> &n){ _roadtoit.push_back(n); }
  14.     int get_id(){ return _id; }
  15.     int get_alias(){ return _alias; }
  16.     int get_level(){ return _level; }
  17.     int get_pos(){ return _pos; }
  18.     void set_pos(int i){ _pos = i; }
  19.     SuperNode* get_oneinroad(int row, int col){ return _roadtoit[row][col]; }
  20.     void set_oneinroad(int row, SuperNode &i){ _roadtoit[row].push_back(&i); }
  21.     vector<SuperNode*> get_roadtoit(int i){ return _roadtoit[i]; }
  22.     SuperNode get_neighbor(int i){ return *_Neighbor[i]; }
  23. };

Como ven tiene algunos métodos y sus atributos el importante para la pregunta es el
Código C++:
Ver original
  1. vector<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 original
  1. int main(){
  2.  
  3. n = lectraDedatos(); // lee los datos y lee cuantos nodos hay n
  4. vector<SuperNode> s (n); // se crea con un vector con n nodos
  5.  
  6. //aquí va un for muy largo.
  7.  
  8. return 0;
  9. }

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
  1. #include <iostream>;
  2. #include <vector>;
  3.  
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.     int i = 0;
  9.     vector<int> v(10,50);
  10.     int *p = &v[0];
  11.     cout << "Dirección del puntero:  " << p << endl;
  12.     cout << "contenido del puntero:  " << *p << endl << endl;
  13.  
  14.     v.push_back(100);
  15.  
  16.     cout << "Dirección del puntero:  " << p << endl;
  17.     cout << "contenido del puntero:  " << *p << endl << endl;
  18.    
  19.     int *p2 = &v[0];
  20.     cout << "Dirección del puntero 2:  " << p2 << endl;
  21.     cout << "contenido del puntero 2:  " << *p2 << endl << endl;
  22.  
  23.     cin.get();
  24.     return 0;
  25. }

El puntero p se pierde una vez se muda vector.

Última edición por dmorill; 24/09/2016 a las 15:15 Razón: más información