Posso usare i cicli annidati con i vettori in cpp?

ho un problema con cpp e non so cosa sia sbagliato … forse puoi aiutarmi :). Sto cercando di implementare una struttura dati per un grafico. In questo grafico collegherò alcuni nodes, che hanno una piccola distanza euclidea, ma alla seconda iterazione, il mio iteratore punterà a 0x0. Questo caso appare solo se fornisco la distanza di questi due nodes a std :: cout. Ecco il mio codice:

for(vector::iterator n1 = g->getNodes().begin(); n1 != g->getNodes().end(); ++n1) { for(vector::iterator n2 = g->getNodes().begin(); n2 != g->getNodes().end(); ++n2) { if(*n2 == 0) { // This will be entered after the first iteration of n2. cout << "n2 null" <getDistance(*n2); // just euclidean distance if(distance <= minDistance) { // This works fine: cout << "(" << *n1 << "," << *n2 << ") << endl; // This brings me a "Segmentation fault" cout << "(" << *n1 << " , " << *n2 < " << distance << endl; } } } 

Questo è dovuto dagli anelli annidati? Qualcuno può dirmi la mia colpa? Molte grazie!

EDIT: Ecco un altro codice: node.h

 #ifndef NODE_H_ #define NODE_H_ #include  #include  #include  #include  using namespace std; class Node { private: int x, y, z; public: Node(int x, int y, int z) : x(x), y(y), z(z) { } inline int getX() { return x; } inline int getY() { return y; } inline int getZ() { return z; } inline double getDistance(Node* other) { return sqrt(pow(x-other->getX(), 2) + pow(y-other->getY(), 2) + pow(z-other->getZ(), 2)); } }; #endif 

graph.h

 #ifndef GRAPH_H_ #define GRAPH_H_ #include  #include "node.h" using namespace std; class Graph { private: vector nodes; public: ~Graph() { while(!nodes.empty()) { delete nodes.back(), nodes.pop_back(); } } inline vector getNodes() { return nodes; } inline int getCountNodes() { return nodes.size(); } bool createNode(int x, int y, int z) { nodes.push_back(new Node(x, y, z)); return true; }; #endif 

main.cc

 #include  #include  #include  #include  #include "model/graph.h" using namespace std; int main() { Graph *g = new Graph(); int nodeDistance = 100; for(int z = 0; z <= 300; z += nodeDistance) { for(int x = 0; x <= 500; x += nodeDistance) { for(int y = 0; y createNode(x, y, z); } } } for(vector::iterator n1 = g->getNodes().begin(); n1 != g->getNodes().end(); ++n1) { for(vector::iterator n2 = g->getNodes().begin(); n2 != g->getNodes().end(); ++n2) { if(*n2 == 0) { // This will be entered after the first iteration of n2. cout << "n2 null" <getDistance(*n2); // just euclidean distance if(distance <= nodeDistance) { // This works fine: cout << "(" << *n1 << "," << *n2 << ") << endl; // This brings me a "Segmentation fault" cout << "(" << *n1 << " , " << *n2 < " << distance << endl; } } } delete g; return 0; } 

Uno dei problemi principali è che la funzione getNodes restituisce una copia di un vettore, non il vettore originale. Quindi i tuoi iteratori che usi nei loop non stanno andando a scorrere sullo stesso vettore.

Invece, gli iteratori che stai usando nei loop nidificati stanno iterando su 4 diversi (ma equivalenti) vettori invece del vettore reale dall’object in questione.

Non c’è niente di sbagliato nel restituire una copia di un vettore in generale. Tuttavia, quando lo fai, devi assicurarti di chiamare tale funzione se vuoi davvero una copia e non lo stesso vettore. L’utilizzo della funzione getNodes durante l’utilizzo non è un utilizzo valido in termini di ciò che si sta tentando di realizzare.

L’errore è qui:

 inline vector getNodes() { return nodes; } 

La correzione:

 inline vector& getNodes() { return nodes; } 

Quest’ultimo garantisce che venga restituito un riferimento al vettore in questione, non una copia del vettore reale. È ansible aggiungere una funzione aggiuntiva che restituisce il vettore come copia se si desidera mantenere la funzionalità disponibile.