범위 기반 For 루프를 사용한 인덱스 추출
C 프로그래밍에서 범위 기반 for 루프는 요소를 반복하는 간결한 방법을 제공합니다. 컨테이너의. 그러나 때로는 추가 반복자에 의존하지 않고 반복 중에 현재 요소의 인덱스를 결정해야 하는 경우가 있습니다.
문제:
값의 벡터와 아래와 같이 범위 기반 for 루프를 사용합니다.
vector<int> list; for(auto& elem:list) { int i = elem; }
내부에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!