N[r jeg s[ vil bruge denne iterator som i f'lgende: Graph* g = new Graph("G"); Vertex* v = g->insertVertex("v");
EdgeList::const_iterator iter3 = g->incidentEdges(v); while(*iter3) { std::cout << "incident edge " << (*iter3)->getName() << std::endl; ++iter3; } giver den segmentation fault. Jeg regner med at det er fordi iteratoren kan v;re tom, men hvordan tester jeg for dette?
En iterator kan ikke være tom. Normalt bruger tester man på om iteratoren er det samme som kontainerens end() (eller begin() hvis det er en reverse iterator).
Jeg forstår ikke denne: while(v->getOutgoing()->begin() != v->getOutgoing()->end() )
yes, der er bare det ved det at brugeren af Graph::incidentEdges forventer en iterator over Edge* jeg ved ikke om du har et forslag til hvordan jeg kan lave min løkke om, dvs de sidste 4 linier kode???
Du kunne give adgang til end(): EdgeList::const_iterator iter3 = g->incidentEdges(v); while(iter3 != something->end()) { std::cout << "incident edge " << (*iter3)->getName() << std::endl; ++iter3; } Det er ikke kønt.
Hvis du er sikker på at der altid er mindst 1 element i listen (dvs den iterator der returneres fra g->incidentEdges(v) er valid, ie != something->end()) Kunne du sætte et mærke i det sidste element, det er heller ikke kønt.
I Graph::incidentEdges laver du en EdgeList (EdgeList* result = new EdgeList(); ) denne bliver ikke nedlagt igen (delete), det medfører et memory leak. Du kunne lade funktionen returnere denne.
ok, den kan s[ ikke lide n[r jeg laver ++iter p[ en iterator der ikke indeholder noget, alts[ hvis der ikke er nogen incidente kanter... hvordan tester jeg for dette?
ellers er der point for indsatsen hvis du laver et svar
En iterator alene kan ikke vide at den er kommet til enden, eller om den ikke "peger" på noget.
Man er nød til at have adgang til containerens end().
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.