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