Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencipta Iterator Meratakan untuk Bekas Bersarang dalam C?

Bagaimanakah Saya Boleh Mencipta Iterator Meratakan untuk Bekas Bersarang dalam C?

Susan Sarandon
Susan Sarandonasal
2024-11-29 13:23:10918semak imbas

How Can I Create a Flattening Iterator for Nested Containers in C  ?

Meratakan Iterator

Iterators adalah penting untuk menavigasi melalui pengumpulan data. Walau bagaimanapun, dalam situasi tertentu, anda mungkin menghadapi bekas bekas, menjadikannya mencabar untuk mengulangi keseluruhan struktur dalam satu laluan. Dalam kes sedemikian, "lelar meratakan" boleh memudahkan proses.

Pelatar Meratakan

Pelatar merata membentangkan bekas bekas sebagai jujukan elemen tunggal yang diratakan . Ini membolehkan anda mengulangi semua elemen secara berturut-turut, tanpa mengira sarang asalnya.

Kekurangan Pelaksanaan Terbina dalam

Walaupun utiliti meratakan iterator, terdapat Tidak banyak pelaksanaan yang sedia ada dalam perpustakaan utama seperti Boost. Oleh itu, mari kita selami pelaksanaan asas yang menangani jurang ini.

Pelaksanaan Tersuai

Pelaksanaan yang disediakan, flattening_iterator, ialah lelaran ke hadapan yang "meratakan" mana-mana bekas daripada bekas. Ia beroperasi dengan melelakan melalui bekas luar dan melelaran secara rekursif melalui mana-mana bekas bersarang. Untuk mengendalikan bekas dalam kosong, fungsi advance_past_empty_inner_containers memastikan iterator melangkauinya.

Penggunaan

Fungsi rata membolehkan anda membina lelaran merata untuk bekas tertentu daripada bekas. Berikut ialah kes ujian minimum:

#include <algorithm>
#include <iostream>
#include <set>
#include <vector>

using namespace std;

int main() {
  // Generate some test data
  vector<vector<int>> v(3);
  int i(0);
  for (auto it(v.begin()); it != v.end(); ++it) {
    it->push_back(i++);
    it->push_back(i++);
    it->push_back(i++);
    it->push_back(i++);
  }

  // Flatten the data and print all the elements
  for (auto it(flatten(v.begin(), v.end())); it != v.end(); ++it) {
    cout << *it << ", ";
  }
  cout << "\n";

  // Using standard library algorithms
  copy(flatten(v.begin(), v.end()), flatten(v.end()),
      ostream_iterator<int>(cout, ", "));

  return 0;
}

Penghadan

Walaupun pelaksanaan ini berfungsi, perlu diingat bahawa ia belum diuji dengan teliti. Jika anda menghadapi sebarang pepijat, sila laporkan supaya ia boleh ditangani.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Iterator Meratakan untuk Bekas Bersarang 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