Heim >Backend-Entwicklung >C++ >Wie kann ich den Index des aktuellen Elements in einer bereichsbasierten C-For-Schleife abrufen?

Wie kann ich den Index des aktuellen Elements in einer bereichsbasierten C-For-Schleife abrufen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-29 07:43:09816Durchsuche

How Can I Get the Index of the Current Element in a C   Range-Based For Loop?

Den Index des aktuellen Objekts in einer bereichsbasierten For-Schleife finden

In einer bereichsbasierten For-Schleife einen Container durchlaufen Bietet direkten Zugriff auf jedes Element, ohne dass ein expliziter Iterator erforderlich ist. Es kann jedoch vorkommen, dass es notwendig wird, den Index des aktuellen Elements in der Schleife zu bestimmen, ohne auf einen separaten Iterator angewiesen zu sein. Diese Frage untersucht eine Methode, um dies mithilfe von Komposition und einer speziellen Reißverschlusstechnik zu erreichen.

Reißverschlusstechnik

Der Schlüssel zu diesem Ansatz liegt im „Verschließen“ des Behälters mit einem Index auf dem Weg. Eine Zipper-Klasse soll ein iteratorähnliches Objekt erstellen, das Zugriff auf den Index und den Wert des Elements im Container bietet. Dieser Reißverschluss dient effektiv als Hülle um den Iterator des ursprünglichen Containers.

Implementierung

Der bereitgestellte C-Code demonstriert diese Technik:

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&amp; operator++() { ++_pos; ++_it; return *this; }
        iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }

        bool operator==(iterator const&amp; it) const { return _it == it._it; }
        bool operator!=(iterator const&amp; it) const { return !(*this == it); }

    private:
        size_t _pos;
        inner_iterator _it;
    };

    Indexer(T&amp; t): _container(t) {}

    iterator begin() const { return iterator(_container.begin()); }
    iterator end() const { return iterator(_container.end()); }

private:
    T&amp; _container;
}; // class Indexer

template <typename T>
Indexer<T>> index(T&amp; t) { return Indexer<T>>(t); }

Dies Code definiert eine Indexer-Klasse, die einen indizierten Iterator für einen bestimmten Container T erstellt. Die Iterator-Klasse stellt einen Verweis auf ein Paar bereit, das den Index und den enthält Wert des Elements. Die Indexfunktion gibt ein Indexer-Objekt zurück, das in der bereichsbasierten for-Schleife verwendet werden kann, um sowohl auf den Index als auch auf den Wert zuzugreifen.

Verwendung

Zur Verwendung dieser Technik , komprimieren Sie den Vektor einfach mit einer Reihe von Ganzzahlen mithilfe der Indexfunktion:

#include <iostream>
#include <iterator>
#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 iteriert die indizierte p-Variable über die Elemente des Vektors v und ermöglicht den Zugriff sowohl auf den Index als auch auf den Wert. Sie können dann innerhalb der Schleife problemlos auf diese Werte zugreifen.

Das obige ist der detaillierte Inhalt vonWie kann ich den Index des aktuellen Elements in einer bereichsbasierten C-For-Schleife abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn