Ist ein Iterator in C++ ein Zeiger?

Lesezeit: 5 Minuten

Benutzer-Avatar
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?

  • es ist dupliziert stackoverflow.com/questions/2728190/…

    – Marsmensch2049

    12. Oktober 2018 um 2:21 Uhr

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.

  • Ich verstehe. Wenn wir ein klassisches Array von C haben, sehen alle Elemente im Speicher wie eine gerade Linie aus, deshalb zeigt das Erhöhen eines Zeigers auf das nächste Element. Im Gegensatz zu einer Liste, bei der sich Elemente in zufälliger Reihenfolge im Speicher befinden können, aber das Erhöhen eines Iterators dazu führt, dass er auf das nächste Element zeigt, unabhängig von der Position des Elements im Speicher. Vielen Dank für den nützlichen Hinweis.

    – Trollpidor

    20. Juni 2015 um 4:43 Uhr

Benutzer-Avatar
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::iteratorzum 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.

1012900cookie-checkIst ein Iterator in C++ ein Zeiger?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy