Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mendapatkan Indeks Unsur dalam Julat C Untuk Gelung?

Bagaimanakah Saya Boleh Mendapatkan Indeks Unsur dalam Julat C Untuk Gelung?

Barbara Streisand
Barbara Streisandasal
2024-12-31 02:09:11864semak imbas

How Can I Get Element Indices in C   Range-Based For Loops?

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!

Kenyataan:
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