Heim > Backend-Entwicklung > C++ > Wie kann ich den Index eines Elements ermitteln, während ich mit einer bereichsbasierten for-Schleife in C einen Vektor iteriere?

Wie kann ich den Index eines Elements ermitteln, während ich mit einer bereichsbasierten for-Schleife in C einen Vektor iteriere?

Susan Sarandon
Freigeben: 2024-12-05 03:18:11
Original
934 Leute haben es durchsucht

How can I get the index of an element while iterating through a vector using a range-based for loop in C  ?

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

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

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

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

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!

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