>백엔드 개발 >C++ >C 범위 기반 For 루프에서 요소의 인덱스를 얻는 방법은 무엇입니까?

C 범위 기반 For 루프에서 요소의 인덱스를 얻는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-09 17:12:10240검색

How to Get the Index of an Element in a C   Range-Based For Loop?

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

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