std::ranges:: range
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | ||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
|
헤더 파일에 정의됨
<ranges>
|
||
|
template
<
class
T
>
concept range
=
requires
(
T
&
t
)
{
|
(C++20부터) | |
range
개념은 반복자와 범위의 끝을 나타내는 센티넬을 제공하여 해당 범위의 요소들에 대한 순회를 가능하게 하는 타입의 요구사항을 정의합니다.
목차 |
의미론적 요구사항
주어진 표현식
E
에 대해
decltype
(
(
E
)
)
가
T
일 때,
T
가
range
를 모델링하려면 다음 조건을 만족해야 합니다
-
[ranges:: begin ( E ),ranges:: end ( E ))이 범위(range) 를 나타내며, - ranges:: begin ( E ) 와 ranges:: end ( E ) 모두 분할 상환 상수 시간(amortized constant time)이며, 등식 보존(equality-preserving) 표현식에서 관찰 가능한 방식으로 E 의 값을 변경하지 않으며,
-
ranges::
begin
(
E
)
의 타입이
forward_iterator를 모델링하는 경우, ranges:: begin ( E ) 는 등식 보존(equality-preserving) 입니다(즉, 전방 반복자(forward iterator)는 다중 패스 알고리즘을 지원합니다).
참고 사항
일반적인
range
클래스는 단 두 개의 함수만 제공하면 됩니다:
-
begin()멤버 함수로, 반환 타입이input_or_output_iterator개념을 만족해야 합니다. -
end()멤버 함수로, 반환 타입이sentinel_for<It>개념을 만족해야 합니다. 여기서It는begin()의 반환 타입입니다.
또는, 이들은 비멤버 함수일 수 있으며 인수 의존적 탐색 에 의해 발견될 수 있습니다.
예제
#include <ranges> // 최소 범위 struct SimpleRange { int* begin(); int* end(); }; static_assert(std::ranges::range<SimpleRange>); // 범위가 아님: begin/end 없음 struct NotRange { int t {}; }; static_assert(!std::ranges::range<NotRange>); // 범위가 아님: begin이 input_or_output_iterator를 반환하지 않음 struct NotRange2 { void* begin(); int* end(); }; static_assert(!std::ranges::range<NotRange2>); int main() {}
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3915 | C++20 |
ranges::
begin
(
t
)
와
ranges::
end
(
t
)
암시적 표현 변형을 요구하지 않았음 |
중복된 설명을
제거함 |