迭代嵌套容器通常是一項繁瑣且容易出錯的任務。為了簡化這個過程,我們探索「扁平化」迭代器的概念,它允許我們將容器的層次結構視為單一扁平序列。
假設我們有一個集合包含整數的向量,我們希望將它們作為單一連續列表進行迭代。一個簡單的 std::vector<:vector>> ;可能還不夠,因為它需要單獨導航每個巢狀向量。
為了解決這個問題,我們可以建立一個自訂迭代器,flattening_iterator,它按順序迭代巢狀容器。此迭代器:
flattening_iterator 實作如下:
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_; };
我們可以使用flattening_iterator來展平嵌套容器作為如下:
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; }
這將輸出嵌套容器中所有整數的展平列表:
1 2 3 4 5 6 7 8 9 10 11 12
flattening_iterator 提供了一種簡單有效的方法將嵌套容器作為單一扁平序列進行迭代。這簡化了程式碼並消除了複雜的巢狀循環結構或透過巢狀層次結構進行手動導航的需求。
以上是自訂迭代器如何簡化巢狀容器的迭代?的詳細內容。更多資訊請關注PHP中文網其他相關文章!