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

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

Barbara Streisand
풀어 주다: 2024-11-29 07:43:09
원래의
812명이 탐색했습니다.

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

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

범위 기반 for 루프에서 컨테이너 반복 명시적인 반복자가 필요 없이 각 요소에 직접 액세스할 수 있습니다. 그러나 별도의 반복기에 의존하지 않고 루프에서 현재 요소의 인덱스를 결정해야 하는 상황이 발생할 수 있습니다. 이 질문은 구성과 특수한 지퍼 기술을 사용하여 이를 달성하는 방법을 탐구합니다.

지퍼 기술

이 접근 방식의 핵심은 컨테이너를 지퍼로 "압축"하는 것입니다. 길을 따라 색인. 지퍼 클래스는 컨테이너에 있는 요소의 인덱스와 값 모두에 대한 액세스를 제공하는 반복자와 같은 객체를 생성하도록 설계되었습니다. 이 지퍼는 원래 컨테이너의 반복자 주위에 래퍼 역할을 효과적으로 수행합니다.

구현

제공된 C 코드는 이 기술을 보여줍니다.

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&amp; operator++() { ++_pos; ++_it; return *this; }
        iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }

        bool operator==(iterator const&amp; it) const { return _it == it._it; }
        bool operator!=(iterator const&amp; it) const { return !(*this == it); }

    private:
        size_t _pos;
        inner_iterator _it;
    };

    Indexer(T&amp; t): _container(t) {}

    iterator begin() const { return iterator(_container.begin()); }
    iterator end() const { return iterator(_container.end()); }

private:
    T&amp; _container;
}; // class Indexer

template <typename T>
Indexer<T>> index(T&amp; t) { return Indexer<T>>(t); }
로그인 후 복사

이것은 코드는 주어진 컨테이너 T에 대해 색인화된 반복자를 생성하는 Indexer 클래스를 정의합니다. 반복자 클래스는 색인을 포함하는 쌍에 대한 참조를 제공합니다. 그리고 요소의 값입니다. index 함수는 범위 기반 for 루프에서 인덱스와 값에 모두 액세스하는 데 사용할 수 있는 Indexer 개체를 반환합니다.

사용법

이 기술을 사용하려면 , 인덱스 함수를 사용하여 정수 범위로 벡터를 압축하기만 하면 됩니다.

#include <iostream>
#include <iterator>
#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";
    }
}
로그인 후 복사

이 예에서 인덱스된 p 변수는 반복됩니다. 벡터 v의 요소에 대해 인덱스와 값 모두에 대한 액세스를 제공합니다. 그러면 루프 내에서 이러한 값에 쉽게 액세스할 수 있습니다.

위 내용은 C 범위 기반 For 루프에서 현재 요소의 인덱스를 어떻게 얻을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿