範囲ベースの for ループでオブジェクトのインデックスを決定する方法
範囲ベースの for ループのコンテキストでは、多くの場合、コンテナ内の現在の要素のインデックスにアクセスすることが望ましい。次のコードを考えてみましょう:
vector<int> list; for (auto& elem : list) { int i = elem; }
このシナリオでは、別の反復子を維持せずにリスト ベクトル内の要素の位置を知りたい場合があります。
ジッパー ベースのアプローチ
これを実現するには、「ジッパー」アプローチを使用できます。コンテナーを直接反復処理する代わりに、途中でインデックスを使用してコンテナーを「圧縮」できます。
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 { public: typedef std::pair<size_t, typename iterator_extractor<T>::type::reference> reference; iterator(typename iterator_extractor<T>::type 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==(const iterator& it) const { return _it == it._it; } bool operator!=(const iterator& it) const { return !(*this == it); } private: size_t _pos; typename iterator_extractor<T>::type _it; }; Indexer(T& t) : _container(t) {} iterator begin() const { return iterator(_container.begin()); } iterator end() const { return iterator(_container.end()); } private: T& _container; }; template <typename T> Indexer<T>& index(T& t) { return Indexer<T>(t); }
このコードは、要素とそのインデックスをペアで結合するイテレーターを提供する Indexer クラスを作成します。 。このインデクサーを利用すると、インデックスと要素に同時にアクセスできます。
使用例
次のコードは、ジッパー アプローチの使用方法を示しています。
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (auto p : index(v)) { cout << p.first << ": " << p.second << "\n"; } return 0; }
このコードは、インデックスと要素の値を次の形式で出力します:
0: 1 1: 2 2: 3 3: 4 4: 5 5: 6 6: 7 7: 8 8: 9
以上がC 範囲ベースの For ループで要素のインデックスを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。