Indexextraktion mit bereichsbasierten For-Schleifen
In der C-Programmierung bietet eine bereichsbasierte for-Schleife eine präzise Möglichkeit, über Elemente zu iterieren eines Containers. Manchmal ist es jedoch erforderlich, den Index des aktuellen Elements während der Iteration zu bestimmen, ohne auf einen zusätzlichen Iterator angewiesen zu sein.
Problem:
Gegeben ist ein Vektor von Werten und eine bereichsbasierte for-Schleife wie unten gezeigt:
vector<int> list; for(auto& elem:list) { int i = elem; }
Gibt es eine Möglichkeit, die Position von elem innerhalb des Vektors zu finden, ohne eine separate Schleife beizubehalten? Iterator?
Lösung:
Ja, es ist möglich, den Index zu extrahieren, während eine bereichsbasierte for-Schleife durchlaufen wird. Diese Technik beinhaltet eine Kombination aus Vorlagenstrukturen und Iteratoren:
template <typename T> struct iterator_extractor { typedef typename T::iterator type; }; template <typename T> struct iterator_extractor<T const&> { typedef typename T::const_iterator type; }; 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); }
Dieses Code-Snippet bietet die Möglichkeit, über einen Container zu iterieren und gleichzeitig den Index und den Wert zu erfassen. Die Indexer-Klasse umschließt den Container und stellt einen benutzerdefinierten Iterator bereit, der Paare von Indizes und Elementreferenzen liefert.
Beispielverwendung:
Um die Indexer-Klasse in einem Bereich zu verwenden- Basierend auf der for-Schleife können Sie Folgendes tun:
#include <iostream> #include <limits> #include <vector> int main() { 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"; } }
In diesem Beispiel druckt die Schleife jedes Element des Vektors entlang mit seinem Index:
0: 1 1: 2 2: 3 3: 4 4: 5 5: 6 6: 7 7: 8 8: 9
Das obige ist der detaillierte Inhalt vonWie kann ich den Index eines Elements ermitteln, während ich mit einer bereichsbasierten for-Schleife in C einen Vektor iteriere?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!