범위 기반 for 루프는 값 범위를 반복하는 데 편리한 구문입니다. 그러나 루프 내에서 현재 개체의 인덱스에 액세스하는 방법은 제공되지 않습니다. 이는 컨테이너 내 객체의 위치를 기준으로 객체에 대한 연산을 수행해야 하는 경우 문제가 될 수 있습니다.
다행히 별도의 Iterator를 유지하지 않고도 현재 객체의 인덱스를 찾을 수 있는 방법이 있습니다. 비결은 구성 기법을 사용하는 것입니다. 컨테이너를 직접 반복하는 대신, 도중에 인덱스를 사용하여 "압축"할 수 있습니다.
작동 방식은 다음과 같습니다.
지퍼 코드 원래 반복자를 래핑하고 인덱스 필드를 추가하는 새로운 반복자 유형을 생성하는 클래스입니다. iterator_extractor 구조체는 컨테이너에서 기본 반복자 유형을 추출하는 데 사용됩니다.
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); }
지퍼 코드를 사용하려면 컨테이너를 인덱서 함수로 래핑하고 반복하면 됩니다. 결과 반복자 범위에 대해. 반복자는 현재 개체의 인덱스와 값을 모두 제공합니다.
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
지퍼 코드는 다음과 같습니다. 범위 기반 for 루프에서 현재 객체의 인덱스를 찾는 강력한 도구이지만 특정 상황에 더 적합할 수 있는 대체 접근 방식도 있습니다.
별도의 반복자: 별도의 반복자를 유지하면 반복 프로세스를 보다 직접적으로 제어할 수 있습니다. 반복자를 사용하여 현재 객체의 인덱스를 명시적으로 찾거나 컨테이너에서 다른 작업을 수행할 수 있습니다.
Boost.Range: Boost.Range 라이브러리는 다음을 위한 다양한 도구를 제공합니다. 인덱싱된 어댑터를 포함하여 범위를 조작합니다. 인덱스 어댑터를 사용하면 원래 범위의 각 요소를 해당 인덱스와 쌍을 이루는 반복기 범위를 만들 수 있습니다.
사용자 정의 범위 클래스: 현재 객체의 인덱스를 포함하는 반복자입니다. 이 접근 방식을 사용하면 반복 프로세스를 가장 유연하게 제어할 수 있습니다.
범위 기반 for 루프에서 현재 개체의 인덱스를 찾는 데 사용할 수 있는 몇 가지 옵션이 있습니다. 귀하의 애플리케이션에 가장 적합한 선택은 특정 요구 사항과 관련된 장단점에 따라 달라집니다.
위 내용은 C 범위 기반 For 루프에서 현재 개체의 인덱스를 어떻게 얻을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!