首頁 > 後端開發 > C++ > 主體

自訂迭代器如何簡化巢狀容器的迭代?

Patricia Arquette
發布: 2024-11-26 05:36:09
原創
617 人瀏覽過

How Can a Custom Iterator Simplify Iterating Through Nested Containers?

使用自訂迭代器展平巢狀容器

簡介

迭代嵌套容器通常是一項繁瑣且容易出錯的任務。為了簡化這個過程,我們探索「扁平化」迭代器的概念,它允許我們將容器的層次結構視為單一扁平序列。

問題

假設我們有一個集合包含整數的向量,我們希望將它們作為單一連續列表進行迭代。一個簡單的 std::vector<:vector>> ;可能還不夠,因為它需要單獨導航每個巢狀向量。

自訂 flattening_iterator

為了解決這個問題,我們可以建立一個自訂迭代器,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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板