範囲ベースの For ループで現在のオブジェクトのインデックスを見つける
範囲ベースの for ループで、コンテナーを反復処理する明示的なイテレータを必要とせずに、各要素に直接アクセスできます。ただし、別の反復子に依存せずにループ内の現在の要素のインデックスを決定する必要がある状況が発生する可能性があります。この質問では、合成と特殊なジッパー技術を使用してこれを実現する方法を検討します。
ジッパー技術
このアプローチの鍵は、コンテナを「ジッパー」で圧縮することにあります。途中のインデックス。ジッパー クラスは、コンテナ内の要素のインデックスと値の両方へのアクセスを提供するイテレータのようなオブジェクトを作成するように設計されています。このジッパーは、元のコンテナのイテレータのラッパーとして効果的に機能します。
実装
提供されている C コードは、この手法を示しています。
template <typename T> struct iterator_extractor { typedef typename T::iterator type; }; template <typename T> struct iterator_extractor<T const> { typedef typename T::const_iterator type; }; 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); }
Thisコードは、特定のコンテナ T のインデックス付きイテレータを作成する Indexer クラスを定義します。イテレータ クラスは、への参照を提供します。要素のインデックスと値を含むペア。インデックス関数は、範囲ベースの for ループでインデックスと値の両方にアクセスするために使用できる Indexer オブジェクトを返します。
使用方法
この手法を使用するには、index 関数を使用して、整数の範囲でベクトルを圧縮するだけです:
#include <iostream> #include <iterator> #include <limits> #include <vector> int main() { 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"; } }
この例では、インデックス付きの p 変数ベクトル v の要素を反復処理し、インデックスと値の両方へのアクセスを提供します。その後、ループ内でこれらの値に簡単にアクセスできます。
以上がC 範囲ベースの For ループで現在の要素のインデックスを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。