Heim >Backend-Entwicklung >C++ >Wie erhalte ich den Index eines Elements in einer C-bereichsbasierten For-Schleife?

Wie erhalte ich den Index eines Elements in einer C-bereichsbasierten For-Schleife?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-09 17:12:10239Durchsuche

How to Get the Index of an Element in a C   Range-Based For Loop?

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!

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