Hola,
Cita:
Iniciado por eferion
Código C++:
Ver originalbool siEstaEnBlock(vector<int>& v, int i);
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
Código C++:
Ver originalvector<int>::iterator itSigue;
while (vStack.empty() == false){ //recorre una componente
itSigue = nextVecino(vit.back(), Vertex[vStack.back() - 1].get_adjaList(), itNULL);
...
}
¿Ese código no es equivalente a este otro?
Código C++:
Ver originalauto itSigue = Vertex[vStack.back() - 1].get_adjaList();
while (vStack.empty() == false){ //recorre una componente
...
++itSigue;
}
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 Otra equivalencia:
Código C++:
Ver originalbool siEstaEnBlock(vector<int>& v, int i){
vector<int>::iterator it = v.begin();
for (; it != v.end(); it++) {
if (i == *it) return true;
}
return false;
}
bool siEstaEnBlock(const vector<int>& v, int i)
{
auto it = std::find(v.begin(),v.end(),i);
return it != v.end();
}
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 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 originalvoid 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 originalInfoNodo::InfoNodo(int id, vector<int> adjaList){
_id = id;
_adjaList = adjaList;
_stack = false;
_blocked = false;
_siSoyCiclo = false;
}
Donde se deben hacer dichas implementaciones?
Saludo