
Trollpidor
Ist ein Iterator in C++ ein Zeiger? Der Grund, warum ich frage, ist, dass anscheinend niemand vollständig versteht, was ein Iterator ist. Es ist nur ein “Ding” oder ein “Wert”, sagen sie. Aber ein Iterator zeigt einfach auf das Element, auf seine Position. Wenn wir es dereferenzieren, ist es so, als würden wir uns ansehen, worauf ein Iterator zeigt.
Ist es eine richtige Analogie?
Die kurze Antwort lautet:
- Pointer ist eine Art Iterator.
- Pointer kann daher als Iterator verwendet werden.
- Pointer hat andere Eigenschaften als Iterator.
Geschichte
Historisch gesehen haben wir einen C-Zeiger, und er wurde in C++ angepasst, als C++ erfunden wurde. Der Zeiger stellt eine Stelle im Speicher dar und kann daher als Stelle in einem Array verwendet werden.
Später, in den 1990er Jahren, wird eine Idee namens “Iterator-Konzept” in C++ eingeführt. Das “Iterator-Konzept” bezieht sich auf eine Bibliothek namens STL (die später in die Standardbibliothek aufgenommen wird) und ein Paradigma namens “generische Programmierung”. Das Iteratorkonzept ist vom C-Zeiger inspiriert, um einen Ort in Containern darzustellen, z vector
, deque
und andere, genau wie C-Zeiger die Position im Array darstellen. Das Iteratorkonzept wurde sorgfältig entwickelt, um mit dem C-Zeiger kompatibel zu seindaher können wir heute sagen C-Zeiger modelliert Iteratorkonzept.
Iterator-Konzept
Eine vereinfachte Art, das Iteratorkonzept zu verstehen, besteht darin, dass ein Datentyp, der eine Liste von Operationen und Verhaltensweisen unterstützt, sodass er einen Ort in einem Container darstellt und eine Art Zugriff auf das Element ermöglicht, als Iterator bezeichnet werden kann.
Bei sorgfältiger Gestaltung des Iteratorkonzepts C-Zeiger erfüllen diese Liste. Pointer ist also eine Art Iterator.
Das Iteratorkonzept, das nur eine Reihe von Anforderungen an Typen ist, bedeutet, dass Sie Ihren eigenen Iterator durch die C++-Power der Datenabstraktion erstellen können.
Andere Eigenschaften des Zeigers
Pointer weist andere Eigenschaften auf, die nicht mit dem Iteratorkonzept zusammenhängen.
Eine bedeutende Verwendung von Zeigern besteht darin, Referenzsemantik auszudrücken, dh auf ein Objekt an einem entfernten Speicherort zu verweisen. Diese Verwendung des Zeigers wird später als unsicher angesehen und führt zur Erfindung des “intelligenten Zeigers”. Durch den Vergleich von intelligenten Zeigern und Iteratoren können wir feststellen, dass es sich um völlig voneinander unabhängige Konzepte handelt.
Eine andere Verwendung des Zeigers besteht darin, auf einen Rohspeicherort zu verweisen. Dies ist für die Anwendungsprogrammierung völlig unsicher, aber ein wesentliches Werkzeug für die Mikrocontroller-Programmierung, um Hardware zu manipulieren.
Nein. Ein Iterator ist nicht “nur ein Zeiger”.
In einigen Fällen kann ein Iterator ein Zeiger sein – aber es kann mehr sein. Ein Iterator ist eine Verallgemeinerung dessen, was ein Zeiger tut.
Wenn Sie einen Zeiger inkrementieren, rückt er zur nächsten Stelle im Speicher vor (modulo der Größe der Objekte, die Sie verarbeiten). Wenn Sie einen Iterator inkrementieren, rückt er zum “nächsten Element in der Sequenz” vor. Wenn Sie mit einer verketteten Liste arbeiten, rückt sie zum nächsten Element in der Liste vor. Wenn Sie mit einer Map oder einem Set arbeiten, zum nächsten Element in der Map/dem Set und so weiter.

Xiaotian Pei
Iterator ist allgemeiner als Zeiger. Falls es sich nicht um einen Zeiger handelt, handelt es sich nur um eine normale Klasse mit benutzerdefinierten Eigenschaften operator++()
, operator++(int)
, operator--()
, operator--(int)
, operator->()
, operator*()
usw. Sie können in diesen Operatoren beliebige Verhaltensweisen implementieren. nichts Magisches hier.
Ein Iterator ist nur ein Objekt, das verwendet werden kann, um die Elemente in einem Container zu iterieren. Es gibt verschiedene Kategorien von Iteratoren. Der Unterschied besteht darin, welche Operationen sie unterstützen, z. B. mit einem Forward-Iterator, den Sie verwenden können ++
um von einem Element zum nächsten zu gehen und mit einem Iterator mit wahlfreiem Zugriff können Sie in einem Schritt von einem Element zum anderen gehen.
http://www.cplusplus.com/reference/iterator/
Iteratoren sind normalerweise Strukturen, die einen Zeiger enthalten, dem eine gemeinsame Schnittstelle gegeben wird, die Container verwenden können, um ihre Elemente zu durchqueren. Dies ist jedoch nicht immer der Fall. In einigen Implementierungen von Standardcontainern std::vector::iterator
zum Beispiel, iterator
ist lediglich definiert als typedef T* iterator
Tatsächlich hängt der Unterschied zwischen einem Zeiger und einem Iterator wirklich von der Implementierung des Iterators ab.
In C können Sie ein Array durchlaufen, indem Sie ein einfaches verwenden for
Schleife mit einer Zeigervariable wie folgt:
int arr[MAX];
for (int* p = arr; p < arr + MAX; ++p)
{
do_something_with(*p);
}
Dies funktioniert, weil ein Array zusammenhängend im Arbeitsspeicher gespeichert wird. Aber für andere Arten von Datenstrukturen – verknüpfte Listen, Bäume, Hash-Tabellen usw. – ist der Code zum Wechseln zum nächsten Element des Containers komplizierter als einfach ++
.
Ein C++-Iterator ist wie ein Zeiger, aber er lässt sich auf alle Arten von Containern verallgemeinern.
std::set<int> s;
for (std::set<int>::const_iterator it = s.begin(); it != s.end(); ++it)
{
do_something_with(*it);
}
Woher std::set<T>::const_iterator
ist eine überladene Klasse ++
und *
Operatoren, sodass es wie ein Zeiger auf ein Array-Element aussieht. Hinter den Kulissen, die ++
Der Operator folgt den Verknüpfungen innerhalb der internen Baumstruktur des Satzes, um zum nächsten Element zu gelangen.
Das std::vector
und std::string
Klassen haben auch Iteratoren, aber da diese Klassen Wrapper um klassische Arrays sind, könnten dies auch nur Typedefs der entsprechenden Zeigertypen sein.
Iteratoren können auch für andere Dinge als die Iterationsvariable in einer Schleife verwendet werden. Beispielsweise haben Container oft a find
-Methode, die einen Iterator an das gefundene Objekt zurückgibt.
10129000cookie-checkIst ein Iterator in C++ ein Zeiger?yes
es ist dupliziert stackoverflow.com/questions/2728190/…
– Marsmensch2049
12. Oktober 2018 um 2:21 Uhr