範囲ベースの For ループを使用したインデックス抽出
C プログラミングでは、範囲ベースの for ループは要素を反復する簡潔な方法を提供しますコンテナの。ただし、追加の反復子に依存せずに反復中に現在の要素のインデックスを決定することが必要になる場合があります。
問題:
値のベクトルが与えられ、以下に示す範囲ベースの for ループ:
vector<int> list; for(auto& elem:list) { int i = elem; }
メンテナンスせずにベクトル内の要素の位置を見つける方法はありますか?別のイテレータ?
解決策:
はい、範囲ベースの for ループを繰り返しながらインデックスを抽出することができます。この手法には、テンプレート化された構造と反復子の組み合わせが含まれます。
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); }
このコード スニペットは、インデックスと値を同時にキャプチャしながらコンテナーを反復処理する機能を提供します。 Indexer クラスはコンテナをラップし、インデックスと要素参照のペアを生成するカスタム イテレータを提供します。
使用例:
範囲内で Indexer クラスを使用するには、- for ループに基づいて、次の操作を行うことができます。
#include <iostream> #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"; } }
この例では、ループは、ベクトルとそのインデックス:
0: 1 1: 2 2: 3 3: 4 4: 5 5: 6 6: 7 7: 8 8: 9
以上がC で範囲ベースの for ループを使用してベクトルを反復処理しているときに要素のインデックスを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。