ネストされたコンテナの反復処理は、多くの場合、退屈でエラーが発生しやすい作業になります。このプロセスを簡素化するために、「フラット化」イテレータの概念を検討します。これにより、コンテナの階層を単一のフラット化されたシーケンスとして扱うことができます。
セットがあるとします。整数を含むベクトルを 1 つの連続したリストとして反復処理したいと考えています。単純な std::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 中国語 Web サイトの他の関連記事を参照してください。