Ver Mensaje Individual
  #13 (permalink)  
Antiguo 15/02/2016, 08:44
dmorill
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Incrementar un iterador de un vector<MyClass>

Hola,

Cita:
Iniciado por eferion Ver Mensaje
Código C++:
Ver original
  1. bool siEstaEnBlock(vector<int>& v, int i);
  2. bool siEstaEnBlock(vector<int>& v, int i){

Las funciones únicamente hay que declararlas si las mismas son llamadas en algún punto anterior a su implementación. Si no se da el caso la declaración sobra:
Gracias lo tendré en cuenta, pero como estoy aprendiendo, y he visto el tema de las declaraciones e implementaciones, se me ha quedado grabado jeje. Una pregunta si no son necesarias esas declaraciones si las implemento antes de usarlas en el código, para que se utilizan?

Cita:
Iniciado por eferion Ver Mensaje
Código C++:
Ver original
  1. vector<int>::iterator itSigue;
  2. while (vStack.empty()  == false){        //recorre una componente
  3.   itSigue = nextVecino(vit.back(), Vertex[vStack.back() - 1].get_adjaList(), itNULL);
  4.   ...
  5. }
¿Ese código no es equivalente a este otro?
Código C++:
Ver original
  1. auto itSigue = Vertex[vStack.back() - 1].get_adjaList();
  2. while (vStack.empty()  == false){        //recorre una componente
  3.   ...
  4.   ++itSigue;
  5. }
Realmente no, la mía devuelve un iterador la tuya un vector, pues .get_adjaList(); retorna la lista de nodos adyacentes. Pero lo más importante es que el mio está dentro del while, eso es necesario porque hay que almacenar en que vecino está y seguir avanzando. Ejemplo del grafo b de que adjunte antes:

La siguiente gráfica es una captura dentro del while, los datos a la iz, y a la derecha el stack que es donde voy comprobando si hay o no hay ciclo, pos es la posición de la lista de vecinos, por ejempo el nodo 3 vamos al 4 que es la posición 3 de los vecinos de nodo 3 (1,2,4,6) (contando desde 1 jeje no desce 0 para el ejemplo).



Mi stack tiene los nodos 1-5-2-3-4 e imagina que regreso del nodo 4 al nodo 3, para seguir recorriendo el grafo debo seguir en el siguiente vecino del 3, de la posición 3 a la posición 4 es decir de vecino 4 a vecino 6. y esto para cada nodo por tanto hay que guardar en que vecino está cada nodo. No es que se recorra todos los vecinos de una vez. sino que se crea un árbol de todas las combinaciones de nodos.

Cita:
Iniciado por eferion Ver Mensaje
Otra equivalencia:

Código C++:
Ver original
  1. bool siEstaEnBlock(vector<int>& v, int i){
  2.     vector<int>::iterator it = v.begin();
  3.     for (; it != v.end(); it++) {
  4.         if (i == *it) return true;
  5.     }
  6.     return false;
  7. }
  8.  
  9. bool siEstaEnBlock(const vector<int>& v, int i)
  10. {
  11.   auto it = std::find(v.begin(),v.end(),i);
  12.   return it != v.end();
  13. }
jeje, debo estudiar más esa programación. Pues no sabía de esa función find. No me gusta usar mucho los auto, al menos hasta que maneje mejor c++, pues así me ayuda a comprender mejor el código sabiendo bien que devuelve cada función.

Cita:
Iniciado por eferion Ver Mensaje
Por otro lado... ¿Por qué pones toda la implementación de la clase en la cabecera?? Parece una chorrada pero las implementaciones no deberían ir en la cabecera salvo casos muy puntuales... si en algun momento trabajas con proyectos más grandes verás la diferencia en los tiempos de compilación y en el mantenimiento.
Te refieres a que implemento algunas funciones inline, dentro de la clase? así:

Código C++:
Ver original
  1. void set_blockedmap(int i){ _blockedmap.push_back(i); }

O a funciones miembro, que los implemento fuera de la clase pero en la cabecera, ejemplo:

Código C++:
Ver original
  1. InfoNodo::InfoNodo(int id, vector<int> adjaList){
  2.     _id = id;
  3.     _adjaList = adjaList;
  4.     _stack = false;
  5.     _blocked = false;
  6.     _siSoyCiclo = false;
  7. }

Donde se deben hacer dichas implementaciones?

Saludo