>백엔드 개발 >C++ >C 범위 기반 For 루프에서 현재 개체의 인덱스를 어떻게 얻을 수 있습니까?

C 범위 기반 For 루프에서 현재 개체의 인덱스를 어떻게 얻을 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-28 11:42:13961검색

How Can I Get the Index of the Current Object in a C   Range-Based For Loop?

범위 기반 For 루프에서 현재 개체의 인덱스 찾기

범위 기반 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.