Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Iterator Tersuai Boleh Memudahkan Lelaran Melalui Bekas Bersarang?

Bagaimanakah Iterator Tersuai Boleh Memudahkan Lelaran Melalui Bekas Bersarang?

Patricia Arquette
Patricia Arquetteasal
2024-11-26 05:36:09618semak imbas

How Can a Custom Iterator Simplify Iterating Through Nested Containers?

Meratakan Bekas Bersarang dengan Iterator Tersuai

Pengenalan

Membalas melalui bekas bersarang selalunya boleh menjadi tugas yang membosankan dan mudah ralat. Untuk memudahkan proses ini, kami meneroka konsep lelaran "meratakan", yang membolehkan kami menganggap hierarki bekas sebagai urutan tunggal yang diratakan.

Masalah

Andaikan kita mempunyai satu set vektor yang mengandungi integer, dan kami ingin mengulanginya sebagai satu senarai bersebelahan. Std mudah::vector> mungkin tidak mencukupi, kerana ia memerlukan menavigasi melalui setiap vektor bersarang secara berasingan.

Petera_perata tersuai

Untuk menangani isu ini, kami boleh mencipta lelaran tersuai, meratakan_iterator, yang melelaran melalui bekas bersarang secara berurutan. Peulang ini:

  • Mengambil sebagai inputnya sebagai peulang ke bekas paling luar.
  • Menjejaki kedudukan semasa dalam kedua-dua bekas paling luar dan paling dalam.
  • Pendahuluan iterator dengan bergerak secara berperingkat melalui bekas bersarang sehingga ia mencapai penghujung atau menemui bahagian paling dalam yang kosong bekas.

Pelaksanaan

Leter_flattening dilaksanakan seperti berikut:

template <typename OuterIterator>
class flattening_iterator
{
public:
    // ... iterator category, value type, etc.
    
    flattening_iterator(outer_iterator it) : outer_it_(it), outer_end_(it) { }
    flattening_iterator(outer_iterator it, outer_iterator end) : outer_it_(it), outer_end_(end) { advance_past_empty_inner_containers(); }
    
    // ... operators for comparison, dereferencing, and advancement
    
private:
    void advance_past_empty_inner_containers()
    {
        // Advance until we find a non-empty innermost container
        while (outer_it_ != outer_end_ && inner_it_ == outer_it_->end())
        {
            ++outer_it_;
            if (outer_it_ != outer_end_)
                inner_it_ = outer_it_->begin();
        }
    }
    
    outer_iterator outer_it_;
    outer_iterator outer_end_;
    inner_iterator inner_it_;
};

Penggunaan

Kita boleh menggunakan leter_flattening untuk meratakan bekas bersarang seperti berikut:

std::unordered_set<std::vector<int>> s;

s.insert({});
s.insert({1,2,3,4,5});
s.insert({6,7,8});
s.insert({9,10,11,12});

// Create a flattening iterator and iterate over the flattened set
for (auto it = flatten(s.begin()); it != s.end(); ++it)
{
    std::cout << *it << endl;
}

Ini akan mengeluarkan senarai diratakan semua integer dalam bekas bersarang:

1
2
3
4
5
6
7
8
9
10
11
12

Kesimpulan

Leter_flattening menyediakan cara yang mudah dan berkesan untuk mengulangi bekas bersarang sebagai satu jujukan yang diratakan. Ini memudahkan kod dan menghapuskan keperluan untuk struktur gelung bersarang yang kompleks atau navigasi manual melalui hierarki bersarang.

Atas ialah kandungan terperinci Bagaimanakah Iterator Tersuai Boleh Memudahkan Lelaran Melalui Bekas Bersarang?. 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