Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh mendapatkan indeks elemen semasa melelaran melalui vektor menggunakan gelung berasaskan julat dalam C ?

Bagaimanakah saya boleh mendapatkan indeks elemen semasa melelaran melalui vektor menggunakan gelung berasaskan julat dalam C ?

Susan Sarandon
Lepaskan: 2024-12-05 03:18:11
asal
944 orang telah melayarinya

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

Pengekstrakan Indeks menggunakan Range-Based For Gelung

Dalam pengaturcaraan C, berasaskan julat untuk gelung menawarkan cara ringkas untuk mengulang elemen daripada sebuah bekas. Walau bagaimanapun, kadangkala ia menjadi perlu untuk menentukan indeks unsur semasa semasa lelaran tanpa bergantung pada lelaran tambahan.

Masalah:

Diberikan vektor nilai dan gelung berasaskan julat seperti yang ditunjukkan di bawah:

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

Adakah terdapat cara untuk mencari kedudukan elem dalam vektor tanpa mengekalkan iterator yang berasingan?

Penyelesaian:

Ya, adalah mungkin untuk mengekstrak indeks semasa melelaran melalui gelung berasaskan julat. Teknik ini melibatkan gabungan struktur templat dan iterator:

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

Coretan kod ini memberikan kebolehan untuk lelaran pada bekas sambil menangkap indeks dan nilai secara serentak. Kelas Indexer membalut bekas dan menyediakan iterator tersuai yang menghasilkan pasangan indeks dan rujukan elemen.

Contoh Penggunaan:

Untuk menggunakan kelas Indexer dalam julat- berdasarkan gelung, anda boleh melakukan perkara berikut:

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

Dalam contoh ini, gelung akan mencetak setiap elemen vektor bersama dengan indeksnya:

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 Bagaimanakah saya boleh mendapatkan indeks elemen semasa melelaran melalui vektor menggunakan gelung berasaskan julat dalam C ?. 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