ホームページ  >  記事  >  バックエンド開発  >  カスタム イテレータを使用すると、ネストされたコンテナの反復処理をどのように簡素化できるでしょうか?

カスタム イテレータを使用すると、ネストされたコンテナの反復処理をどのように簡素化できるでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-26 05:36:09618ブラウズ

How Can a Custom Iterator Simplify Iterating Through Nested Containers?

カスタム イテレータを使用したネストされたコンテナのフラット化

はじめに

ネストされたコンテナの反復処理は、多くの場合、退屈でエラーが発生しやすい作業になります。このプロセスを簡素化するために、「フラット化」イテレータの概念を検討します。これにより、コンテナの階層を単一のフラット化されたシーケンスとして扱うことができます。

問題

セットがあるとします。整数を含むベクトルを 1 つの連続したリストとして反復処理したいと考えています。単純な std::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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。