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

Bagaimanakah Iterator Tersuai Boleh Memudahkan Lelaran Melalui Bekas Bersarang?

Patricia Arquette
Lepaskan: 2024-11-26 05:36:09
asal
706 orang telah melayarinya

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_;
};
Salin selepas log masuk

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;
}
Salin selepas log masuk

Ini akan mengeluarkan senarai diratakan semua integer dalam bekas bersarang:

1
2
3
4
5
6
7
8
9
10
11
12
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan