Bestimmter Wert schon im vector enthalten?
-
Ja, kann man ohne Pointer umsetzen. Solange du ohne Polymorphie auskommst. Und das scheint bei deiner Point und Wire Klasse der Fall zu sein. Probier es doch einfach mal ohne Pointer! (du bist in der C++-Welt!) Der Code wird dadurch sogar kürzer.
-
PACoSys schrieb:
Variante 2 würde ich ja gerne verwenden, aber Iteratoren können nicht dereferenziert werden.
Wer erzählt denn sowas? Klar können Iteratoren dereferenziert werden, andernfalls wären sie ziemlich nutzlos.
-
CStoll schrieb:
Wer erzählt denn sowas?
Die Microsoft Visual C++ Debug Library. Ich kann das Projekt compilieren und ausführen, aber an dem Punkt wo ich den Iterator dereferenziere bekomme ich eine schicke Fehlermeldung:
Debug Assertion Failed!
Program: ...
File: ...
Line: ...Expression: vector iterator not dereferencable
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.@Artchi: Wo speichere ich dann meine Punkte, ich dachte die müsste ich mir mit Pointern merken?! Insbesondere die Nachbarschaft, bisher speichere ich mir einen Pointer, aber aus einem vector<Point> bekomme ich keinen Pointer.
Gruß
Patrick
-
PACoSys schrieb:
CStoll schrieb:
Wer erzählt denn sowas?
Die Microsoft Visual C++ Debug Library. Ich kann das Projekt compilieren und ausführen, aber an dem Punkt wo ich den Iterator dereferenziere bekomme ich eine schicke Fehlermeldung:
Debug Assertion Failed!
Program: ...
File: ...
Line: ...Expression: vector iterator not dereferencable
Da hast du vermutlich den falschen Iterator erwischt (sog. singuläre Iteratoren wie end() dürfen nicht dereferenziert werden, aber das mußt du abfangen, bevor du darauf zugreifen willst)
@Artchi: Wo speichere ich dann meine Punkte, ich dachte die müsste ich mir mit Pointern merken?! Insbesondere die Nachbarschaft, bisher speichere ich mir einen Pointer, aber aus einem vector<Point> bekomme ich keinen Pointer.
Warum speicherst du nicht die Indizes der Nachbarn im vector<> (und einen Verweis auf das Vater-Element)?
-
Zu der Assertion: dann wird der Iterator wohl ungültig sein, sprich Null. Es ist ein Laufzeitfehler und kein Compile-Fehler, oder? Also lässt sich der Iterator prinzipiell dereferenzieren, aber zur Laufzeit schein ein ungültiger Wert drin zu stecken. Wahrscheinlich wird es der end-Iterator sein? Und den sollte man auch nicht dereferenzieren, da er HINTER das letzte Element im Container zeigt.
Zu den vector<Point>: die Points werden als Objekte gespeichert, und nicht als Pointer.
Hier mal ein paar Basics:
http://www.kharchi.de/cppratgeber1.htm
http://www.kharchi.de/cppratgeber2.htm
-
@Artchi: Wo speichere ich dann meine Punkte, ich dachte die müsste ich mir mit Pointern merken?! Insbesondere die Nachbarschaft, bisher speichere ich mir einen Pointer, aber aus einem vector<Point> bekomme ich keinen Pointer.
Versteh ich nicht. Welche Pointer willst du? Von dem Vector? Oder von dem einzelnen Point? Für beide bekommst du den Pointer oder auch die Referenz, wenn du sie dir holst. Warum denn nicht?
Point *p1 = &(points.at(1)); // Pointer vom Point-ObjektAber einfach den Index merken, anstatt eines Pointers, wäre auch nicht verkehrt.
-
Danke für Eure Antworten. Ich mache es jetzt komplett ohne Pointer und es sieht echt um einiges besser aus. Habe da wohl doch noch nicht ganz die Verwendung von Pointern gerafft.
EDIT: Die Nachbarschaften speichere ich mir in zwei int-Variablen pro Point-Instanz.
Gruß
Patrick
-
Wenn ich mit einem Iterator durch einen Vektor iteriere :), kann ich dann irgendwie die Position im vector herausfinden? Also z.B. bla ist das fünfte Element im vector.
Gruß
Patrick
-
Ehm, eigentlich braucht man doch sowas nicht wissen, oder? Aber probier mal folgendes: Aktueller iterator minus begin. Wird aber vielleicht nicht funktionieren? Habs nie ausprobiert.
-
std::distance( x.begin(), myIt );Macht bei vector nichts anderes, als die beiden Iteratoren zu subtrahieren (also wie von Artchi vorgeschlagen). Hat allerdings den Vorteil dass es auch bei Iteratoren funktioniert die nicht Random-Access sind. In diesem Fall wird halt durchgezählt (der erste Iterator wird kopiert und solang inkrementiert bis er dem zweiten Iterator entspricht).