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

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

Barbara Streisand
Barbara Streisandasal
2024-11-28 11:42:13961semak imbas

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

Mencari Indeks Objek Semasa dalam Julat Berasaskan Untuk Gelung

Berasaskan julat untuk gelung ialah sintaks yang mudah untuk lelaran pada julat nilai. Walau bagaimanapun, ia tidak menyediakan cara untuk mengakses indeks objek semasa dalam gelung. Ini boleh menjadi masalah jika anda perlu melakukan operasi pada objek berdasarkan kedudukannya dalam bekas.

Nasib baik, terdapat cara untuk mencari indeks objek semasa tanpa mengekalkan lelaran yang berasingan. Caranya ialah menggunakan teknik gubahan. Daripada melelang ke atas bekas secara terus, kami boleh "zip" dengan indeks di sepanjang jalan.

Begini cara ia berfungsi:

Kod Zip

Kod zip ialah kelas yang mencipta jenis lelaran baharu yang membalut lelaran asal dan menambah medan indeks. Struktur iterator_extractor digunakan untuk mengekstrak jenis iterator asas daripada bekas.

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

Menggunakan Kod Zip

Untuk menggunakan kod zip, hanya bungkus bekas dalam fungsi pengindeks dan ulangi atas julat lelaran yang terhasil. Peulang akan menyediakan kedua-dua indeks dan nilai objek semasa.

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

Ini akan mengeluarkan:

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

Pendekatan Alternatif

Sementara kod zip adalah alat yang berkuasa untuk mencari indeks objek semasa dalam gelung berasaskan julat, terdapat juga pendekatan alternatif yang mungkin lebih sesuai dalam beberapa situasi.

Lelaran Berasingan: Mengekalkan lelaran berasingan membolehkan lebih kawalan langsung ke atas proses lelaran. Anda boleh menggunakan iterator untuk mencari secara eksplisit indeks objek semasa atau untuk melaksanakan operasi lain pada bekas.

Boost.Julat: Pustaka Boost.Range menyediakan beberapa alatan untuk memanipulasi julat, termasuk penyesuai diindeks. Penyesuai diindeks boleh digunakan untuk mencipta julat lelaran yang menggandingkan setiap elemen dalam julat asal dengan indeksnya.

Kelas Julat Tersuai: Anda boleh mencipta kelas julat tersuai anda sendiri yang menyediakan iterator yang merangkumi indeks objek semasa. Pendekatan ini memberikan anda fleksibiliti paling banyak dalam mengawal proses lelaran.

Kesimpulan

Terdapat beberapa pilihan yang tersedia untuk mencari indeks objek semasa dalam gelung berasaskan julat. Pilihan terbaik untuk permohonan anda bergantung pada keperluan khusus dan pertukaran yang terlibat.

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