Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mendapatkan Indeks Unsur dalam Julat C Untuk Gelung?

Bagaimana untuk Mendapatkan Indeks Unsur dalam Julat C Untuk Gelung?

Patricia Arquette
Patricia Arquetteasal
2024-12-09 17:12:10242semak imbas

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

Cara Menentukan Indeks Objek dalam Julat Berasaskan untuk Gelung

Dalam konteks berasaskan julat untuk gelung, ia selalunya wajar untuk mengakses indeks unsur semasa dalam bekas. Pertimbangkan kod berikut:

vector<int> list;
for (auto& elem : list) {
    int i = elem;
}

Dalam senario ini, anda mungkin ingin mengetahui kedudukan elem dalam vektor senarai tanpa mengekalkan lelaran yang berasingan.

Pendekatan Berasaskan Zip

Untuk mencapai matlamat ini, pendekatan "zip" boleh digunakan. Daripada melelakan terus ke atas bekas, anda boleh "zip" dengan indeks di sepanjang jalan.

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); }

Kod ini mencipta kelas Indexer yang menyediakan lelaran yang menggabungkan elemen dan indeksnya dalam pasangan . Dengan menggunakan Indexer ini, anda boleh mengakses indeks dan elemen secara serentak.

Contoh Penggunaan

Kod berikut menunjukkan cara menggunakan pendekatan zip:

#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;
}

Kod ini akan mencetak nilai indeks dan elemen dalam format berikut:

0: 1
1: 2
2: 3
3: 4
4: 5
5: 6
6: 7
7: 8
8: 9

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Indeks Unsur dalam Julat C Untuk Gelung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn