warum kann ich nicht einen iterator dereferenzieren?
Wenn ich ein vector von Objekten (einfache Objekte, keine Pointer oder Referenzen), warum kann ich nicht das tun?
Object* object;
object = vectorOfObjects.end();
oder
object = &vectorOfObjects.end();
oder
object = &(*vectorOfObjects.end());
auch die gleiche Frage, wenn "Objekt" war eine Referenz.
Ich nehme an, Sie wollte nicht erklären, Objekt wie ein Zeiger, nachdem es ausdrücklich zu sagen, dass Ihre Objekte waren von Wert?
InformationsquelleAutor SirYakalot | 2012-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie drei separate Fehler:
wird nicht funktionieren, weil
end()
liefert einen iterator, undobject
ist ein Zeiger. Diese sind in der Regel verschiedene Typen (A-Vektor kann verwenden Sie raw-Pointern als Iteratoren, aber nicht in allen Implementierungen. Andere Container erfordern eine spezielle iterator-Typen).funktioniert nicht, da nehmen Sie die Adresse des zurückgegebenen iterator. Das heißt, Sie bekommen einen Zeiger auf einen iterator, sondern einen Zeiger auf eine
Object
.funktioniert nicht, da die
end
iterator nicht auf ein gültiges element. Es Punkte, die man hinter dem Ende der Sequenz. Und ja, es kann nicht aufgelöst werden. Können Sie dereferenzieren das Letzte element in der Sequenz (das wäre--vectorOfObjects.end()
), aber nicht ein iterator verweist Vergangenheit Ende.Schließlich, das zugrunde liegende problem/Verwirrung könnte sein, dass du denkst, dass ein iterator umgewandelt werden können, um einen Zeiger. Im Allgemeinen kann es nicht. Wenn Sie Ihren container ist ein Vektor, du bist garantiert, die Elementen zugeordnet sind, zusammenhängend, wie ein array, also einen Zeiger funktionieren wird. Aber für, sagen wir, ein
list
, die einen Zeiger auf ein element nutzlos ist. Es nicht geben Ihnen jede Art und Weise zu erreichen, die nächsten element.InformationsquelleAutor jalf
Weil
.end()
gibt einen iterator, nicht einObject
, die noch nicht einmal eine gültige Mitglied des Vektors.Sogar mit
begin()
gibt ein gültiges Objekt, brauchen Sie die folgende:Der korrekte Weg wäre:
InformationsquelleAutor Luchian Grigore
Dies ist, weil durch die Konvention
end
zeigt nicht auf einen gültigen Speicherort in den container: er sitzt an einem Ort, den man über das Ende des Containers, also die Dereferenzierung ist es illegal.Die situation mit
begin()
ist das anders: Sie können zu dereferenzieren, wennv.begin() != v.end()
(d.h. wenn der container nicht leer ist):Wenn Sie benötigen Zugriff auf das Letzte element haben, können Sie dies tun:
Wieder, das funktioniert nur, wenn dein Vektor enthält mindestens ein element.
Das ist, warum ich fügte hinzu, ein Sternchen, eigentlich dereferenzieren der iterator, wie der Frage-Titel schon sagt 🙂
Ist der start () - eine Abkürzung für begin() ?
Ja, natürlich ist es! Vielen Dank für den Hinweis it out.
InformationsquelleAutor dasblinkenlight
Objekt* bedeutet, dass ein Zeiger auf ein Objekt, wo ein pointer ist eine Speicheradresse. Aber die .end () - Methode gibt ein Iterator ist ein Objekt selbst, nicht auf eine Speicher Adresse.
InformationsquelleAutor msgmash.com