範囲ベースの for ループは、値の範囲を反復するための便利な構文です。ただし、ループ内の現在のオブジェクトのインデックスにアクセスする方法は提供されません。コンテナ内のオブジェクトの位置に基づいてオブジェクトの操作を実行する必要がある場合、これは問題になる可能性があります。
幸いなことに、別のイテレータを維持せずに現在のオブジェクトのインデックスを見つける方法があります。コツは作曲テクニックを使うことです。コンテナを直接反復処理する代わりに、途中でインデックスを使用してコンテナを「圧縮」できます。
その仕組みは次のとおりです:
ジッパー コード元のイテレータをラップし、インデックス フィールドを追加する新しいイテレータ型を作成するクラスです。 iterator_extractor 構造体は、基礎となるイテレータ型をコンテナから抽出するために使用されます。
template <typename T> class Indexer { public: class iterator { typedef typename iterator_extractor<T>::type inner_iterator; typedef typename std::iterator_traits<inner_iterator>::reference inner_reference; public: typedef std::pair<size_t, inner_reference> reference; iterator(inner_iterator it): _pos(0), _it(it) {} reference operator*() const { return reference(_pos, *_it); } iterator& operator++() { ++_pos; ++_it; return *this; } iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; } bool operator==(iterator const& it) const { return _it == it._it; } bool operator!=(iterator const& it) const { return !(*this == it); } private: size_t _pos; inner_iterator _it; }; Indexer(T& t): _container(t) {} iterator begin() const { return iterator(_container.begin()); } iterator end() const { return iterator(_container.end()); } private: T& _container; }; // class Indexer template <typename T> Indexer<T> index(T& t) { return Indexer<T>(t); }
ジッパー コードを使用するには、コンテナをインデクサ関数でラップして反復処理するだけです。結果の反復子の範囲にわたって。イテレータは、現在のオブジェクトのインデックスと値の両方を提供します。
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (auto p: index(v)) { std::cout << p.first << ": " << p.second << "\n"; }
これは出力します:
0: 1 1: 2 2: 3 3: 4 4: 5 5: 6 6: 7 7: 8 8: 9
ジッパー コードがこれは、範囲ベースの for ループで現在のオブジェクトのインデックスを見つけるための強力なツールですが、特定の用途に適した代替アプローチもあります。
個別の反復子: 個別の反復子を維持すると、反復プロセスをより直接的に制御できるようになります。イテレータを使用すると、現在のオブジェクトのインデックスを明示的に検索したり、コンテナ上で他の操作を実行したりできます。
Boost.Range: Boost.Range ライブラリは、次のようなさまざまなツールを提供します。インデックス付きアダプターを含む範囲の操作。インデックス付きアダプターを使用すると、元の範囲内の各要素とそのインデックスを組み合わせるイテレータ範囲を作成できます。
カスタム範囲クラス: を提供する独自のカスタム範囲クラスを作成できます。現在のオブジェクトのインデックスを含むイテレータ。このアプローチにより、反復プロセスを最も柔軟に制御できます。
範囲ベースの for ループで現在のオブジェクトのインデックスを検索するために使用できるオプションがいくつかあります。アプリケーションに最適な選択は、特定の要件と関連するトレードオフによって異なります。
以上がC 範囲ベースの For ループで現在のオブジェクトのインデックスを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。