範囲ベースの For ループでの要素の位置の検索
プログラミングでは、反復される要素のインデックスまたは位置を決定することが必要になることがよくあります。以上。コンテナを反復処理する便利な方法を提供する範囲ベースの for ループを使用する場合、別の反復子を使用せずに現在の要素のインデックスを取得できるかどうかという疑問が生じます。
解決策
1.ジッパー技術
方法の 1 つは、ジッパーと呼ばれる技術を使用することです。これには、途中でコンテナとインデックスを組み合わせ、各ペアがインデックスと対応する要素で構成される新しい範囲のペアを作成することが含まれます。
struct Indexer { class iterator { iterator(typename T::iterator it): _pos(0), _it(it) {} std::pair<size_t, typename T::reference> operator*() const { return std::make_pair(_pos, *_it); } // ... }; iterator begin() const { return iterator(_container.begin()); } iterator end() const { return iterator(_container.end()); } private: T& _container; };
Indexer クラスを使用すると、反復処理が可能になります。コンテナを介してインデックスと要素の両方を同時に取得します。
2. Boost.Range
もう 1 つのオプションには、Boost.Range ライブラリの利用が含まれます。具体的には、boost::adaptors::indexed アダプターを使用して、反復ごとにインデックスと要素の両方を含む派生範囲を作成できます。
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (auto const& [idx, elem]: boost::adaptors::indexed(v)) { std::cout << idx << ": " << elem << "\n"; }
boost から取得した結果の範囲を反復することで、次のようになります。 :adaptors::indexed、インデックスと要素は for ループ内でアクセスできます。
3.カスタム反復子
特定のシナリオでは、現在のインデックスを維持するカスタム反復子を作成することが望ましい場合があります。このイテレータを範囲ベースの for ループと組み合わせて使用すると、インデックスと要素の両方にアクセスできます。
class IndexedIterator { private: container_type* _container; size_t _index; public: IndexedIterator(container_type* c) : _container(c), _index(0) {} bool operator!=(const IndexedIterator& other) const { return _container != other._container || _index != other._index; } std::pair<size_t, value_type> operator*() const { return std::make_pair(_index, *_container[_index]); } IndexedIterator& operator++() { _index++; return *this; } };
カスタム イテレータを定義し、それをコンテナのイテレータ タイプに適合させることにより、次のものを取得できます。 for ループ内で要素とそのインデックスを直接指定します。
以上がC 範囲ベースの For ループで要素インデックスを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。