Die bereichsbasierte for-Schleife ist eine praktische Syntax zum Durchlaufen eines Wertebereichs. Es bietet jedoch keine Möglichkeit, auf den Index des aktuellen Objekts innerhalb der Schleife zuzugreifen. Dies kann problematisch sein, wenn Sie Operationen am Objekt basierend auf seiner Position im Container ausführen müssen.
Glücklicherweise gibt es eine Möglichkeit, den Index des aktuellen Objekts zu finden, ohne einen separaten Iterator zu verwalten. Der Trick besteht darin, eine Kompositionstechnik zu verwenden. Anstatt direkt über den Container zu iterieren, können wir ihn unterwegs mit einem Index „komprimieren“.
So funktioniert es:
Der Zipper-Code ist eine Klasse, die einen neuen Iteratortyp erstellt, der den ursprünglichen Iterator umschließt und ein Indexfeld hinzufügt. Die iterator_extractor-Struktur wird verwendet, um den zugrunde liegenden Iteratortyp aus dem Container zu extrahieren.
template <typename T> class Indexer { public: class iterator { typedef typename iterator_extractor<T>::type inner_iterator; typedef typename std::iterator_traits<inner_iterator>::reference inner_reference; public: typedef std::pair<size_t, inner_reference> reference; iterator(inner_iterator it): _pos(0), _it(it) {} reference operator*() const { return reference(_pos, *_it); } iterator& operator++() { ++_pos; ++_it; return *this; } iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; } bool operator==(iterator const& it) const { return _it == it._it; } bool operator!=(iterator const& it) const { return !(*this == it); } private: size_t _pos; inner_iterator _it; }; Indexer(T& t): _container(t) {} iterator begin() const { return iterator(_container.begin()); } iterator end() const { return iterator(_container.end()); } private: T& _container; }; // class Indexer template <typename T> Indexer<T> index(T& t) { return Indexer<T>(t); }
Um den Zipper-Code zu verwenden, wickeln Sie den Container einfach in die Indexerfunktion ein und iterieren Sie über den resultierenden Iteratorbereich. Der Iterator stellt sowohl den Index als auch den Wert des aktuellen Objekts bereit.
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (auto p: index(v)) { std::cout << p.first << ": " << p.second << "\n"; }
Dies wird ausgegeben:
0: 1 1: 2 2: 3 3: 4 4: 5 5: 6 6: 7 7: 8 8: 9
Während der Reißverschlusscode lautet Obwohl es sich um ein leistungsstarkes Tool zum Finden des Index des aktuellen Objekts in einer bereichsbasierten for-Schleife handelt, gibt es auch alternative Ansätze, die in bestimmten Fällen möglicherweise besser geeignet sind Situationen.
Separater Iterator: Die Verwaltung eines separaten Iterators ermöglicht eine direktere Kontrolle über den Iterationsprozess. Sie können den Iterator verwenden, um explizit den Index des aktuellen Objekts zu finden oder andere Operationen am Container auszuführen.
Boost.Range: Die Boost.Range-Bibliothek bietet eine Reihe von Tools für Manipulationsbereiche, einschließlich des indizierten Adapters. Mit dem indizierten Adapter kann ein Iteratorbereich erstellt werden, der jedes Element im ursprünglichen Bereich mit seinem Index verknüpft.
Benutzerdefinierte Bereichsklasse: Sie können Ihre eigene benutzerdefinierte Bereichsklasse erstellen, die einen bereitstellt Iterator, der den Index des aktuellen Objekts enthält. Dieser Ansatz bietet Ihnen die größte Flexibilität bei der Steuerung des Iterationsprozesses.
Es stehen mehrere Optionen zur Verfügung, um den Index des aktuellen Objekts in einer bereichsbasierten for-Schleife zu finden. Die beste Wahl für Ihre Anwendung hängt von den spezifischen Anforderungen und den damit verbundenen Kompromissen ab.
Das obige ist der detaillierte Inhalt vonWie kann ich den Index des aktuellen Objekts in einer bereichsbasierten C-For-Schleife abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!