Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mendapatkan Indeks Unsur Semasa dalam Julat C Untuk Gelung?
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& 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); }
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!