Mencari Kedudukan Elemen dalam Range-Based Untuk Gelung
Dalam pengaturcaraan, selalunya perlu untuk menentukan indeks atau kedudukan elemen yang diulang habis. Apabila menggunakan berasaskan julat untuk gelung, yang menawarkan cara yang mudah untuk lelaran melalui bekas, persoalan timbul jika mungkin untuk mendapatkan semula indeks elemen semasa tanpa menggunakan lelaran yang berasingan.
Penyelesaian
1. Teknik Zip
Satu kaedah melibatkan penggunaan teknik yang dipanggil zip. Ini melibatkan menggabungkan bekas dengan indeks di sepanjang jalan, mencipta julat pasangan baharu di mana setiap pasangan terdiri daripada indeks dan elemen yang sepadan.
struct Indexer { class iterator { iterator(typename T::iterator it): _pos(0), _it(it) {} std::pair<size_t, typename T::reference> operator*() const { return std::make_pair(_pos, *_it); } // ... }; iterator begin() const { return iterator(_container.begin()); } iterator end() const { return iterator(_container.end()); } private: T& _container; };
Dengan menggunakan kelas Indexer, ia menjadi mungkin untuk mengulang atas bekas dan dapatkan kedua-dua indeks dan elemen secara serentak.
2. Boost.Range
Pilihan lain melibatkan penggunaan perpustakaan Boost.Range. Khususnya, rangsangan::penyesuai::penyesuai terindeks boleh digunakan untuk mencipta julat terbitan yang merangkumi kedua-dua indeks dan elemen untuk setiap lelaran.
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (auto const& [idx, elem]: boost::adaptors::indexed(v)) { std::cout << idx << ": " << elem << "\n"; }
Dengan melelaran ke atas julat terhasil yang diperoleh daripada rangsangan: :adaptors::indexed, indeks dan elemen boleh diakses dalam gelung for.
3. Iterator Tersuai
Dalam senario tertentu, mungkin wajar untuk mencipta lelaran tersuai yang mengekalkan indeks semasa. Peulang ini boleh digunakan bersama dengan gelung berasaskan julat untuk mengakses kedua-dua indeks dan elemen.
class IndexedIterator { private: container_type* _container; size_t _index; public: IndexedIterator(container_type* c) : _container(c), _index(0) {} bool operator!=(const IndexedIterator& other) const { return _container != other._container || _index != other._index; } std::pair<size_t, value_type> operator*() const { return std::make_pair(_index, *_container[_index]); } IndexedIterator& operator++() { _index++; return *this; } };
Dengan mentakrifkan lelaran tersuai dan menyesuaikannya dengan jenis lelaran bekas, adalah mungkin untuk mendapatkan elemen dan indeksnya terus dalam gelung for.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Indeks Unsur dalam Julat C Untuk Gelung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!