Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mendapatkan Indeks Unsur Semasa dalam Julat C Untuk Gelung?

Bagaimanakah Saya Boleh Mendapatkan Indeks Unsur Semasa dalam Julat C Untuk Gelung?

Barbara Streisand
Barbara Streisandasal
2024-11-29 07:43:09816semak imbas

How Can I Get the Index of the Current Element in a C   Range-Based For Loop?

Mencari Indeks Objek Semasa dalam Julat Berasaskan Untuk Gelung

Dalam julat berasaskan untuk gelung, berulang melalui bekas menyediakan akses kepada setiap elemen secara langsung tanpa memerlukan iterator yang jelas. Walau bagaimanapun, mungkin timbul situasi di mana ia menjadi perlu untuk menentukan indeks unsur semasa dalam gelung tanpa bergantung pada lelaran yang berasingan. Soalan ini meneroka kaedah untuk mencapai ini menggunakan gubahan dan teknik zip khusus.

Teknik Zip

Kunci kepada pendekatan ini terletak pada "mengzip" bekas dengan indeks di sepanjang jalan. Kelas zip direka bentuk untuk mencipta objek seperti iterator yang menyediakan akses kepada kedua-dua indeks dan nilai elemen dalam bekas. Poket zip ini berkesan berfungsi sebagai pembalut di sekeliling lelaran bekas asal.

Pelaksanaan

Kod C yang disediakan menunjukkan teknik ini:

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&amp; operator++() { ++_pos; ++_it; return *this; }
        iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }

        bool operator==(iterator const&amp; it) const { return _it == it._it; }
        bool operator!=(iterator const&amp; it) const { return !(*this == it); }

    private:
        size_t _pos;
        inner_iterator _it;
    };

    Indexer(T&amp; t): _container(t) {}

    iterator begin() const { return iterator(_container.begin()); }
    iterator end() const { return iterator(_container.end()); }

private:
    T&amp; _container;
}; // class Indexer

template <typename T>
Indexer<T>> index(T&amp; t) { return Indexer<T>>(t); }

Ini kod mentakrifkan kelas Indexer yang mencipta lelaran diindeks untuk bekas T yang diberikan. Kelas iterator menyediakan rujukan kepada pasangan mengandungi indeks dan nilai elemen. Fungsi indeks mengembalikan objek Indexer yang boleh digunakan dalam gelung berasaskan julat untuk mengakses kedua-dua indeks dan nilai.

Penggunaan

Untuk menggunakan teknik ini , hanya zip vektor dengan julat integer menggunakan fungsi indeks:

#include <iostream>
#include <iterator>
#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";
    }
}

Dalam contoh ini, pembolehubah p diindeks berulang atas elemen vektor v, menyediakan akses kepada kedua-dua indeks dan nilai. Anda kemudiannya boleh mengakses nilai ini dengan mudah dalam gelung.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Indeks Unsur Semasa 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