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