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
Freigeben: 2024-12-09 17:12:10
Original
238 Leute haben es durchsucht

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;
}
Nach dem Login kopieren

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); }
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage