Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencipta Iterator Meratakan untuk Bekas Bersarang dalam 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!