Namespaces
Variants

std::ranges:: views:: enumerate, std::ranges:: enumerate_view

From cppreference.net
Ranges library
Range adaptors
헤더에 정의됨 <ranges>
template < ranges:: view V >

requires /*range-with-movable-references*/ < V >
class enumerate_view

: public ranges:: view_interface < enumerate_view < V >>
(1) (C++23부터)
namespace views {

inline constexpr /* 지정되지 않음 */ enumerate = /* 지정되지 않음 */ ;

}
(2) (C++23부터)
호출 시그니처
template < ranges:: viewable_range R >

requires /* 아래 참조 */

constexpr /* 아래 참조 */ enumerate ( R && r ) ;
(C++23부터)
헬퍼 개념
template < class R >

concept /*range-with-movable-references*/ =
ranges:: input_range < R > &&
std:: move_constructible < ranges:: range_reference_t < R >> &&

std:: move_constructible < ranges:: range_rvalue_reference_t < R >> ;
(3) ( 설명 전용* )
1) enumerate_view view 를 취하고 tuple 들의 뷰를 생성하는 범위 어댑터입니다. 결과 시퀀스의 i th 번째 요소(튜플)는 다음을 보유합니다:
  • 기본 시퀀스 요소의 0-기반 인덱스인 i 와 동일한 값, 그리고
  • 기본 요소에 대한 참조.
2) 이름 views::enumerate RangeAdaptorObject 를 나타냅니다. 부분 표현식 e 가 주어졌을 때, 표현식 views :: enumerate ( e ) 표현식 동등 합니다 enumerate_view < views:: all_t < decltype ( ( e ) ) >> ( e ) 에 대해, 적절한 부분 표현식 e 가 주어졌을 때.
3) 기본 타입의 참조 타입이 이동될 수 있도록 보장합니다.

enumerate_view 는 기본 뷰 V 가 해당 개념들을 모델링할 때 random_access_range , bidirectional_range , forward_range , input_range , common_range , 그리고 sized_range 개념들을 모델링합니다.

목차

데이터 멤버

멤버 설명
V base_ 기반이 되는 view 에 대한 반복자
( 설명 전용 멤버 객체* )

멤버 함수

enumerate_view 를 생성합니다
(public member function)
기본(적응된) 뷰의 복사본을 반환합니다
(public member function)
시작 부분을 가리키는 반복자를 반환합니다
(public member function)
끝 부분을 가리키는 반복자나 센티널을 반환합니다
(public member function)
요소의 개수를 반환합니다. 기본(적응된) 범위가 sized_range 를 만족하는 경우에만 제공됩니다
(public member function)
결과 approximately_sized_range 의 대략적인 크기를 반환합니다
(public member function)
std::ranges::view_interface 로부터 상속됨
파생된 뷰가 비어 있는지 여부를 반환합니다. sized_range forward_range 를 만족하는 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 시작을 가리키는 상수 반복자를 반환합니다
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 상수 반복자에 대한 센티널을 반환합니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰가 비어 있지 않은지 여부를 반환합니다. ranges::empty 가 적용 가능한 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 첫 번째 요소를 반환합니다. forward_range 를 만족하는 경우 제공됩니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 마지막 요소를 반환합니다. bidirectional_range common_range 를 만족하는 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 n 번째 요소를 반환합니다. random_access_range 를 만족하는 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)

추론 가이드

중첩 클래스

(C++23)
반복자 타입
( 설명 전용 멤버 클래스 템플릿* )
(C++23)
센티넬 타입
( 설명 전용 멤버 클래스 템플릿* )

헬퍼 템플릿

template < class View >

constexpr bool enable_borrowed_range < ranges :: enumerate_view < View >> =

ranges:: enable_borrowed_range < View > ;
(C++23부터)

ranges::enable_borrowed_range 특수화는 기본 뷰가 이를 만족할 때 enumerate_view borrowed_range 를 만족하도록 합니다.

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_ranges_enumerate 202302L (C++23) std::ranges::enumerate_view

예제

#include <initializer_list>
#include <iostream>
#include <map>
#include <ranges>
#include <vector>
int main()
{
    constexpr static auto v = {'A', 'B', 'C', 'D'};
    for (auto const [index, letter] : std::views::enumerate(v))
        std::cout << '(' << index << ':' << letter << ") ";
    std::cout << '\n';
#if __cpp_lib_ranges_to_container
    // 각 요소의 위치를 키로 사용하여 맵 생성
    auto m = v | std::views::enumerate | std::ranges::to<std::map>();
    for (auto const [key, value] : m)
        std::cout << '[' << key << "]:" << value << ' ';
    std::cout << '\n';
#endif
    std::vector<int> numbers{1, 3, 5, 7};
    // const가 있어도 num은 변경 가능하며, 참조에 const가 전파되지 않음
    // const로 만들려면 `std::views::enumerate(numbers) | std::views::as_const`
    // 또는 `std::views::enumerate(std::as_const(numbers))` 사용
    for (auto const [index, num] : std::views::enumerate(numbers))
    {
        ++num; // 타입은 int&
        std::cout << numbers[index] << ' ';
    }
    std::cout << '\n';
}

가능한 출력:

(0:A) (1:B) (2:C) (3:D)
[0]:A [1]:B [2]:C [3]:D
2 4 6 8

참조문헌

  • C++23 표준 (ISO/IEC 14882:2024):
  • 26.7.23 열거 뷰 [range.enumerate]

참고 항목

초기값을 반복적으로 증가시켜 생성된 시퀀스로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
적응된 뷰들의 해당 요소들에 대한 참조의 튜플로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
tuple-like 값들로 구성된 view 와 숫자 N을 취하여 각 튜플의 N th 요소들의 view 를 생성함
(클래스 템플릿) (레인지 어댑터 객체)