Sagen Sie, ich habe eine std::list<int> lst
und einige std::list<int>::iterator it
für das Durchlaufen der Liste. Und abhängig von Wert der it
Ich möchte it + 1
oder it - 1
in meinem Code verwenden. Gibt es eine gute Möglichkeit, das zu tun, wie next()
, prev()
(ich konnte solche Dinge nicht in der Dokumentation stl finden)? Oder sollte ich die it
jedes Mal kopieren und die Kopie erhöhen (dekrementieren)?Wie kommt das nächste (vorherige) Element in std :: list, ohne den Iterator zu inkrementieren (dekrementieren)?
Antwort
Kopieren und Inkrementieren/Dekrementieren der Kopie ist die einzige Möglichkeit, es getan werden kann.
Sie können Wrapper-Funktionen schreiben, um sie zu verstecken (und wie in Antworten erwähnt, C++ 11 hat std :: prev/std :: next, die genau das tun (und Boost definiert ähnliche Funktionen). Aber sie sind Wrapper herum Diese "Kopieren und Inkrementieren" -Operation, so dass Sie sich keine Sorgen machen müssen, dass Sie es "falsch" machen.
Eine einfache vorgetastete Lösung sind prior
und next
von Boost.utility
. Sie nutzen die Vorteile operator--
und operator++
, aber Sie müssen nicht eine temporäre erstellen.
Natürlich sollte erwähnt werden, dass 1. Sie das temporäre selbst erstellen und 2. Sie sollten sich der Randbedingungen bewusst sein. –
Ja, seit C++ 11 gibt es zwei Methoden, die Sie suchen: std::prev
und std::next
. Sie finden sie in der Iterator-Bibliothek.
Beispiel von cppreference.com
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::list<int> v{ 3, 1, 4 };
auto it = v.begin();
auto nx = std::next(it, 2);
std::cout << *it << ' ' << *nx << '\n';
}
Ausgang:
3 4
Und natürlich, wenn Sie nicht C++ 11 haben, sind sie sehr einfach zu implementieren. (Ich denke, die meisten von uns hatten sie in unseren Toolkits, lange bevor sie überhaupt für C++ 11 vorgeschlagen wurden.) –
das war der Trick –
- 1. std :: list iterator: get next Element
- 2. C++ std :: Iterator ohne intern: std :: vector oder std :: list
- 3. Inkrementieren/Dekrementieren gegen Zuweisung?
- 4. numpy.nextafter dekrementieren statt inkrementieren
- 5. Inkrementieren/Dekrementieren ref in mongodb
- 6. Peek das nächste Element in STL-Container
- 7. Wie bekomme ich das nächste Element in struts2 Iterator-Tag
- 8. Post und pre inkrementieren, dekrementieren in C++
- 9. const_iterator vs iterator für std :: list
- 10. Inkrementieren und Dekrementieren Objektwert ändern
- 11. Iterator zum letzten Element in Std :: Liste
- 12. Inkrementieren und Dekrementieren von Daten
- 13. AngularJS - Limit Inkrementieren und Dekrementieren
- 14. Zugriff auf das erste Element von std :: list?
- 15. Wie man einen Iterator std :: list in Schleife mit Inkrement
- 16. Inkrementieren und Dekrementieren Wert in Textbox Labelwert
- 17. Standardwert für das nächste Element in Python-Iterator, wenn der Iterator leer ist?
- 18. Wie auf das vorherige und das nächste Element in angularjs ng-repeat zugreifen
- 19. Inkrementieren und Dekrementieren von "Enum-Klasse"
- 20. SqlServer Set SERIAL_NO Auto Inkrementieren und Dekrementieren
- 21. Ermitteln, ob Iterator das letzte Element von Std :: Map ist
- 22. Das nächste Element holen
- 23. Wie nicht das nächste Element nach itertools.takewhile() zu verpassen
- 24. Entfernen Sie das Element in std :: list, während es zugewiesen bleibt
- 25. Elasticsearch - vorherige/nächste Funktionalität
- 26. Mit std :: finden mit inkrementierten Iterator
- 27. Wie automatisch inkrementieren und dekrementieren, wenn ich tippe Knopf
- 28. vorherige - nächste Abfrage in mysql
- 29. Java LinkedList vorherige nächste
- 30. Erweitern std :: list
Wenn Sie 'it ++' tun, wird es als 'it = it + 1' übersetzt, was technisch das bedeutet Iterator - Objekt könnte auch immer ein neues Objekt sein Nicht sicher, was Sie fragen – Neil
Das Kopieren und Inkrementieren/Dekrementieren der Kopie stellt die einzige Möglichkeit dar. Sie können Wrapper - Funktionen schreiben, um sie auszublenden (und wie in Antworten, C++ 11 hat 'std :: prev' /' std :: next', die genau das tun. Aber sie sind Wrapper um diese "Kopieren und Inkrementieren" -Operation – jalf
Danke @jalf. Ihre Antwort ist die einzige vollständige Antwort. –