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
Lepaskan: 2024-12-09 17:12:10
asal
239 orang telah melayarinya

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;
}
Salin selepas log masuk

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); }
Salin selepas log masuk

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;
}
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan