Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Jadikan Jenis Tersuai Saya Boleh Diterbalikkan Menggunakan Berasaskan Julat Untuk Gelung dalam C ?

Bagaimanakah Saya Boleh Jadikan Jenis Tersuai Saya Boleh Diterbalikkan Menggunakan Berasaskan Julat Untuk Gelung dalam C ?

Patricia Arquette
Patricia Arquetteasal
2024-12-28 22:06:15564semak imbas

How Can I Make My Custom Types Iterable Using Range-Based For Loops in C  ?

Menggunakan "Berasaskan Julat untuk Gelung" dengan Jenis Tersuai

Penyatuan Jenis Tersuai

Untuk mendayakan "berasaskan julat untuk gelung" pada jenis tersuai anda, anda boleh melaksanakan berikut:

  • Fungsi Ahli: Takrifkan begin() dan end() fungsi ahli yang mengembalikan objek yang bertindak seperti iterator.
  • Fungsi Percuma: Cipta fungsi percuma mulakan(Jenis&) dan akhiri(Jenis&) dengan ruang nama yang sama seperti jenis tersuai anda, mengembalikan objek yang berkelakuan seperti iterator.

Ruang nama Pertimbangan

  • Jika jenis tersuai anda tergolong ke ruang nama xml, tentukan xml::begin() atau xml::end() untuk memastikan perkaitan ruang nama yang betul.

Keperluan Nilai Pulangan

Objek yang dikembalikan oleh begin() dan end() tidak perlu menjadi iterator sebenar. Mereka mesti memenuhi keperluan berikut:

  • Laksanakan pra- , memastikan ungkapan permulaan yang sah.
  • Laksanakan binari != untuk perbandingan boolean .
  • Laksanakan unary * untuk memberikan nilai bagi menetapkan kepada pembolehubah gelung.
  • Dedahkan pemusnah awam.

Jenis Terpisah

Dalam C 17, jenis mula dan akhir telah dipisahkan. Ini membolehkan iterator akhir mempunyai jenis yang berbeza daripada iterator permulaan. Ini berguna untuk iterator "sentinel" yang hanya menyokong != dengan jenis lelaran mula, membolehkan lelaran yang cekap ke atas penimbal aksara yang ditamatkan nol.

Contoh Sambungan Pustaka

Pertimbangkan jenis perpustakaan beberapa_struct_you_do_not_control yang mengandungi vektor integer tetapi tidak mempunyai kaedah begin() dan end().

namespace library_ns {
  struct some_struct_you_do_not_control {
    std::vector<int> data;
  };
}

Untuk membuat jenis ini boleh diubah, anda boleh menambah fungsi berikut pada library_ns ruang nama:

namespace library_ns {
  int* begin(some_struct_you_do_not_control&amp; x){ return x.data.data(); }
  int* end(some_struct_you_do_not_control&amp; x){ return x.data.data()+x.data.size(); }
  int const* cbegin(some_struct_you_do_not_control const&amp; x){ return x.data.data(); }
  int* cend(some_struct_you_do_not_control const&amp; x){ return x.data.data()+x.data.size(); }
  int const* begin(some_struct_you_do_not_control const&amp; x){ return cbegin(x); }
  int const* end(some_struct_you_do_not_control const&amp; x){ return cend(x); }
}

Kini, anda boleh lelaran ke atas vektor menggunakan berasaskan julat untuk gelung:

library_ns::some_struct_you_do_not_control s;
for (int i : s) {
  // ...
}

Contoh Jenis Tersuai

Untuk jenis tersuai yang anda kawal, anda boleh mentakrifkan Kaedah begin() dan end() terus dalam jenis:

struct egg_carton {
  std::vector<egg> eggs;
  auto begin() { return eggs.begin(); }
  auto end() { return eggs.end(); }
  // ...
};

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Jadikan Jenis Tersuai Saya Boleh Diterbalikkan Menggunakan Berasaskan Julat Untuk Gelung dalam C ?. 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