Erstens prüfe ich die C++ Stil Iteratoren quickly.for Beispiel:Wie macht man expressivere Python-Iteratoren? wie C++ Iterator
//--- Iterating over vector with iterator.
vector<int> v;
. . .
for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) {
cout << *it << endl;
}
Es flexibel ist. Es ist leicht, zugrunde liegende Containertypen zu ändern. Beispielsweise könnten Sie später entscheiden, dass die Anzahl der Einfügungen und Löschungen so hoch ist, dass eine Liste effizienter ist als ein Vektor. Es hat auch viele nützliche Elementfunktionen. Viele der Elementfunktionen für Vektor verwenden Iteratoren, z. B. zuweisen, einfügen oder löschen. Darüber hinaus können wir einen Iterator (falls unterstützt) bidirektional verwenden, z. B. ++, -. Dies ist nützlich, um einen Stream wie Objekte zu analysieren.
Die Probleme von Python ist: 1: Derzeit ist Python für Schleifensyntax weniger flexibel als C++ für. (naja, sicherer) 2: statt "it! = iter.end()" style, wird python eine Ausnahme auslösen, wenn next() nicht mehr hat. Es ist nicht flexibel.
Frage 1: Ist meine obige Idee richtig?
OK. Hier kommt meine Frage, wie man einen leistungsfähigeren Python-Iterator so leistungsfähig wie C++ - Iteratoren implementiert? Derzeit ist die Syntax für Python for-Schleifen weniger flexibel als für C++. Ich finde auch einige mögliche Lösungen, wie http://www.velocityreviews.com/forums/t684406-pushback-iterator.html. aber es fragt Benutzer push_back ein Zeug statt Iterator zu fragen -.
Frage 2: Was ist der beste Weg, um einen bidirektionalen Iterator in Python zu implementieren? Genau wie http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/. Der Pseudo-Code ist der folgende:
it = v.begin();
while(it!=v.end()) {
//do sth here
if (condition1)
++it;//suppose this iterator supports ++
if(condition2)
--it;//suppose this iterator supports --
}
Die wichtigsten Eigenschaften sind: 1) bidirektional, 2) einfacher "Ende" zu überprüfen. Die "++" oder "-" Operatoren oder allgemeinen Funktionen sind nicht wichtig (es hat sowieso keinen semantischen Unterschied).
Danke,
Update: ich aus den Antworten einige mögliche Lösungen bekam:
i = 0
while i < len(sequence): # or i < len and some_other_condition
star_it = sequence[i]
if condition_one(star_it):
i += 1
if condition_two(star_it):
i = max(i - 1, 0)
Doch anders als Array sollte willkürlichen Zugriff auf die Liste O (n) sein. Ich nehme an, dass das "list" -Objekt in Python intern unter Verwendung von Linked-List-ähnlichen Dingen implementiert ist. Daher ist diese While-Loop-Lösung nicht effizient. In C++ haben wir jedoch "zufälliger Iterator", "bidirektionaler Iterator". Wie soll ich eine bessere Lösung bekommen? Vielen Dank.
Können Sie ein konkretes Beispiel für etwas geben, was Sie in 'Python' nicht tun können, was Sie einfach in' C++ 'tun können? –
Python 'Ausbeute' + Ausnahme Mechanismus ist erstaunlich flexibel (es ist, was wir" Fortsetzungen "in der funktionalen Programmierung nennen). Lerne sie richtig zu benutzen und du wirst belohnt werden. Es ist viel einfacher, zusammengesetzte Iteratoren in Python als in C++ zu definieren. –
Diese Frage ist zu vage und es gibt keine echte Antwort auf die Frage in der aktuellen Form. –