>백엔드 개발 >C++ >C에서 범위 기반 for 루프를 사용하여 벡터를 반복하는 동안 요소의 인덱스를 어떻게 얻을 수 있습니까?

C에서 범위 기반 for 루프를 사용하여 벡터를 반복하는 동안 요소의 인덱스를 어떻게 얻을 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-05 03:18:11931검색

How can I get the index of an element while iterating through a vector using a range-based for loop in C  ?

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

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