Heim >Backend-Entwicklung >C++ >Wie erhalte ich den Index eines Elements in einer C-bereichsbasierten For-Schleife?
So bestimmen Sie den Index eines Objekts in einer bereichsbasierten for-Schleife
Im Zusammenhang mit bereichsbasierten for-Schleifen ist dies häufig der Fall Es ist wünschenswert, auf den Index des aktuellen Elements im Container zuzugreifen. Betrachten Sie den folgenden Code:
vector<int> list; for (auto& elem : list) { int i = elem; }
In diesem Szenario möchten Sie möglicherweise die Position von elem im Listenvektor wissen, ohne einen separaten Iterator zu verwalten.
Zipper-basierter Ansatz
Um dies zu erreichen, kann ein „Reißverschluss“-Ansatz angewendet werden. Anstatt direkt über den Container zu iterieren, können Sie ihn nebenbei mit einem Index „komprimieren“.
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 { public: typedef std::pair<size_t, typename iterator_extractor<T>::type::reference> reference; iterator(typename iterator_extractor<T>::type 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==(const iterator& it) const { return _it == it._it; } bool operator!=(const iterator& it) const { return !(*this == it); } private: size_t _pos; typename iterator_extractor<T>::type _it; }; Indexer(T& t) : _container(t) {} iterator begin() const { return iterator(_container.begin()); } iterator end() const { return iterator(_container.end()); } private: T& _container; }; template <typename T> Indexer<T>& index(T& t) { return Indexer<T>(t); }
Dieser Code erstellt eine Indexer-Klasse, die einen Iterator bereitstellt, der das Element und seinen Index in einem Paar kombiniert . Durch die Verwendung dieses Indexers können Sie gleichzeitig auf den Index und das Element zugreifen.
Beispielverwendung
Der folgende Code zeigt, wie der Zipper-Ansatz verwendet wird:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (auto p : index(v)) { cout << p.first << ": " << p.second << "\n"; } return 0; }
Dieser Code gibt die Index- und Elementwerte im folgenden Format aus:
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 erhalte ich den Index eines Elements in einer C-bereichsbasierten For-Schleife?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!