イテレータのフラット化
イテレータは、データ コレクション内を移動するために不可欠です。ただし、特定の状況では、コンテナーのコンテナーが発生し、単一パスで構造全体を反復処理することが困難になる場合があります。このような場合、「フラット化イテレータ」を使用するとプロセスを簡素化できます。
フラット化イテレータ
フラット化イテレータは、コンテナのコンテナを単一のフラット化された要素のシーケンスとして表します。 。これにより、元のネストに関係なく、すべての要素を連続して反復処理できます。
組み込み実装の欠如
フラット化イテレータの有用性にもかかわらず、 Boost のような主要なライブラリには、既存の実装がほとんどありません。したがって、このギャップに対処する基本的な実装を見てみましょう。
カスタム実装
提供される実装である flattening_iterator は、コンテナを「フラット化」する前方反復子です。コンテナの。これは、外側のコンテナを反復処理し、ネストされたコンテナを再帰的に反復することによって動作します。空の内部コンテナを処理するには、advanced_past_empty_inner_containers 関数を使用して、イテレータがそれらをスキップするようにします。
使用法
flatten 関数を使用すると、特定のコンテナに対してフラット化イテレータを簡単に構築できます。コンテナの。最小限のテスト ケースを次に示します。
#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; }
制限事項
この実装は機能しますが、完全にテストされていないことに注意してください。バグが発生した場合は、対処できるよう報告してください。
以上がC でネストされたコンテナのフラット化イテレータを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。