Frage

Ich bin der Rückkehr zu c++, nachdem er Weg für ein bisschen und versuchen, den Staub aus den alten Melone.

In Java-Iterator ist eine Schnittstelle, um einen container mit Methoden:hasNext(), next() und remove().Die Anwesenheit von hasNext() bedeutet, dass es hat das Konzept einer Grenze für die container Durchlaufen.

//with an Iterator
Iterator<String> iter = trees.iterator();
while (iter.hasNext()) 
{
    System.out.println(iter.next());
}

In der C++ standard template library Iteratoren scheinen, repräsentieren den Datentyp oder Klasse unterstützt den operator++, und operator==, hat aber kein Konzept für ein limit integriert, so dass der Vergleich ist erforderlich, bevor der Förderung auf die nächste Position.Die Begrenzung wird aktiviert, indem der Benutzer den Vergleich von zwei Iteratoren im Normalfall ist der zweite iterator container Ende.

vector<int> vec;
vector<int>::iterator iter;

// Add some elements to vector
v.push_back(1);
v.push_back(4);
v.push_back(8);

for(iter= v.begin(); iter != v.end(); iter++)
{
    cout << *i << " "; //Should output 1 4 8
}

Der interessante Teil hier ist, dass in C++ - Zeiger ist ein iterator auf ein array.Die STL nahm, was war, vorhandene und bauen Konvention um ihn herum.

Es gibt weitere Raffinesse, um diese, die ich bin fehlt?

War es hilfreich?

Lösung

Ja, es gibt einen großen begrifflichen Unterschied. C ++ nutzt verschiedene „Klassen“ von Iteratoren. Einige werden für Direktzugriff (im Gegensatz zu Java), einige sind für den Forward Access (wie Java) verwendet. Während auch andere zum Schreiben von Daten (für die Verwendung mit, sagen wir, transform) verwendet.

Sehen Sie das Iteratoren Konzept in der C ++ Dokumentation :

  • InputIterator
  • Output Iterator
  • Weiterleiten Iterator
  • Bidirektionale Iterator
  • Random Access Iterator

Diese sind viel interessanter und leistungsfähig im Vergleich zu Java / C # 's mickrig Iteratoren. Hoffentlich werden diese Konventionen zu kodifizieren mit C ++ 0x Konzepte .

Andere Tipps

Vielleicht ein bisschen mehr theoretischer Natur. Mathematisch Sammlungen in C ++ kann als halboffenen Intervall von Iteratoren beschrieben, nämlich ein Iterator zeigt auf den Beginn der Sammlung und ein Iterator zeigt hinter das letzte Element.

öffnet diese Konvention eine Vielzahl von Möglichkeiten. Die Art und Weise Algorithmen in C ++ arbeiten, sie können alle Subsequenzen einer größeren Sammlung angewendet werden. Um so etwas Arbeit in Java zu machen, müssen Sie ein Wrapper um eine bestehende Sammlung erstellen, die eine andere Iterator zurückgibt.

Ein weiterer wichtiger Aspekt von Iteratoren wird bereits von Frank erwähnt. Es gibt verschiedene Konzepte von Iteratoren. Java Iteratoren entsprechen C ++‘Eingang Iteratoren, das heißt, sie schreibgeschützt sind Iteratoren, die nur einen Schritt zu einer Zeit erhöht werden kann und nicht rückwärts gehen.

Am anderen Ende der Skala haben Sie C Zeiger, die genau auf C ++‘Konzept eines Random Access Iterator entsprechen.

Alles in allem bietet C ++ ein viel reicheres und reinere Konzept, das entweder als Zeiger oder Java Iteratoren C auf eine viel breitere Palette von Aufgaben angewandt werden kann.

Wie erwähnt, Java und C # Iteratoren beschreiben eine vermischte Position (Zustand) -und-Bereich (Wert), während die C ++ Iteratoren, die Konzepte der Position und Bereich trennen. C ++ Iteratoren stellen ‚wo bin ich jetzt‘ getrennt von ‚wo kann ich gehen?‘.

Java und # Iteratoren C kann nicht kopiert werden. Sie können eine frühere Position erholen. Die gemeinsame C ++ Iteratoren können.

dieses Beispiel :

// for each element in vec
for(iter a = vec.begin(); a != vec.end(); ++a){
  // critical step!  We will revisit 'a' later.
  iter cur = a; 
  unsigned i = 0;
  // print 3 elements
  for(; cur != vec.end() && i < 3; ++cur, ++i){
      cout << *cur << " ";
  }
  cout << "\n";
}

Klicken Sie auf den Link oben Programmausgabe zu sehen.

Diese eher albern Schleife eine Sequenz durchläuft (unter Verwendung von Vorwärts-Iterator Semantik nur), Drucken jede zusammenhängende Teilfolge aus 3 Elementen genau einmal (und ein paar kürzere Teilfolgen am Ende). Aber Elemente N angenommen, und M Elementen pro Zeile statt 3, würde dieser Algorithmus noch O (N * M) Iterator Inkrementen und O (1) Raum.

Der Java-Stil Iteratoren fehlt die Fähigkeit, Position unabhängig zu speichern. Sie werden entweder

  • verlieren O (1) Raum, mit (zum Beispiel) eine Reihe von Größe M Geschichte zu speichern, wie Sie iterieren
  • muß die Liste N-mal zu durchlaufen, so dass O (N ^ 2 + N * M) Zeit
  • oder verwenden Sie einen konkreten Array-Typen mit GetAt Elementfunktion verlieren genericism und die Fähigkeit, verkettete Liste Containertypen zu verwenden.

Da nur vorwärts Iteration Mechanik in diesem Beispiel verwendet wurde, war ich in der Lage mit keine Probleme . Dies ist entscheidend, generische Algorithmen Authoring, wie Suche, verzögerte Initialisierung und Auswertung, Sortieren, etc.

Die Unfähigkeit Zustand zu halten entspricht am ehesten den STL InputIterator C ++, auf denen nur sehr wenige Algorithmen gebaut werden.

Ein Zeiger auf ein Array-Elemente ist in der Tat ein Iterator in das Array.

Wie Sie sagen, in Java, hat ein Iterator mehr Wissen über die zugrunde liegenden Container als in C ++. C ++ Iteratoren sind die allgemeinen, und ein Paar von Iteratoren jeden Bereich bezeichnen kann: dies kann ein Teilbereich eines Behälters, ein Bereich über mehrere Container (siehe http://www.justsoftwaresolutions.co.uk/articles/pair_iterators.pdf oder http://www.boost.org/doc/libs/1_36_0/libs/iterator/ doc / zip_iterator.html ) oder sogar eine Reihe von Zahlen (siehe http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/counting_iterator.html )

Die Iteratorkategorien erkennen, was Sie können und nicht mit einem bestimmten Iterator tun können.

Für mich ist der grundlegende Unterschied ist, dass Java Iteratoren Punkt zwischen den einzelnen Posten, während C ++ STL Iteratoren auf Artikel verweisen.

C ++ Iteratoren sind eine Verallgemeinerung des Zeigers Konzept; sie machen es zu einem breiteren Spektrum von Situationen anwendbar. Es bedeutet, dass sie verwendet werden können, solche Dinge zu tun, als willkürliche Bereiche definieren.

Java-Iteratoren sind relativ stumm Enumeratoren (wenn auch nicht so schlecht, wie C # 's, mindestens Java ListIterator und kann verwendet werden, um die Sammlung zu mutieren)

.

Iteratoren ist nur äquivalent zu Zeigern in dem trivialen Fall von über den Inhalt eines Arrays in Sequenz Iterieren. Ein Iterator-Objekte aus einem beliebigen Anzahl von anderen Quellen werden könnte liefern:. Aus einer Datenbank, aus einer Datei aus dem Netz, aus einer anderen Berechnung, etc.

C ++ Bibliothek (der Teil früher bekannt als STL) Iteratoren ausgelegt sind, mit Zeigern kompatibel zu sein. Java, ohne Pointer-Arithmetik, hatte die Freiheit, mehr Programmierer freundlich zu sein.

In C ++ Sie am Ende mit einem Paar von Iteratoren zu verwenden. In Java entweder Sie einen Iterator oder eine Sammlung verwenden. Iteratoren soll der Klebstoff zwischen Algorithmus und Datenstruktur sein. Code geschrieben für 1.5+ muß selten Iteratoren erwähnen, es sei denn, es wird eine bestimmte Algorithmus oder Datenstruktur Implementierung (die die Mehrheit der Programmierer variieren haben keine Notwendigkeit zu tun). Als Java geht für dynamische Polymorphie Subsets und dergleichen sind viel einfacher zu handhaben.

Es gibt viele gute Antworten über die Unterschiede, aber ich spürte, wie die Sache, die mich am meisten mit Java Iteratoren ärgert wurde nicht betont - Sie können den aktuellen Wert mehrmals nicht lesen. Dies ist in vielen Szenarien wirklich nützlich, vor allem wenn man Iteratoren verschmelzen.

In c ++, haben Sie eine Methode, um den Iterator zu fördern und den aktuellen Wert zu lesen. Lesen seinen Wert nicht vorab die Iteration; so können Sie es mehrmals lesen. Dies ist nicht möglich mit Java Iteratoren und ich am Ende Wrapper zu schaffen, die dies tun.

Eine Randnotiz: eine einfache Möglichkeit, einen Wrapper zu erstellen, ist eine bestehende zu verwenden - PeekingIterator von Guava.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top