범위 기반 for 루프에서 객체의 인덱스를 결정하는 방법
범위 기반 for 루프의 맥락에서는 다음과 같은 경우가 많습니다. 컨테이너 내 현재 요소의 인덱스에 액세스하는 것이 바람직합니다. 다음 코드를 고려하세요.
vector<int> list; for (auto& elem : list) { int i = elem; }
이 시나리오에서는 별도의 반복자를 유지하지 않고 목록 벡터에서 elem의 위치를 알고 싶을 수 있습니다.
Zipper 기반 접근 방식
이를 달성하기 위해 "지퍼" 접근 방식을 사용할 수 있습니다. 컨테이너를 직접 반복하는 대신, 도중에 인덱스를 사용하여 "압축"할 수 있습니다.
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 클래스를 생성합니다. . 이 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!