std::ranges:: views:: common, std::ranges:: common_view
|
헤더에 정의됨
<ranges>
|
||
|
template
<
ranges::
view
V
>
requires
(
not
ranges::
common_range
<
V
>
and
|
(1) | (C++20 이후) |
|
namespace
views
{
inline
constexpr
/* 지정되지 않음 */
common
=
/* 지정되지 않음 */
;
|
(2) | (C++20 이후) |
|
호출 시그니처
|
||
|
template
<
ranges::
viewable_range
R
>
requires
/* 아래 참조 */
|
(C++20 이후) | |
view
를 반복자/감시자 쌍에 대해 서로 다른 타입을 가지는 것에서
view
이면서 동시에
common_range
인 것으로 변환합니다.
common_view
는 항상 동일한 반복자/감시자 타입을 가집니다.
-
views::
all
(
e
)
, 만약 이것이 형성 잘된(well-formed) 표현식이고
decltype
(
(
e
)
)
가
common_range를 모델링하는 경우; - common_view { e } 그렇지 않은 경우.
목차 |
데이터 멤버
| 멤버 | 설명 |
V
base_
(private)
|
기반 뷰
( 설명 전용 멤버 객체* ) |
멤버 함수
common_view
를 생성한다
(public member function) |
|
|
기반(적응된) 뷰의 복사본을 반환한다
(public member function) |
|
|
시작 부분을 가리키는 반복자를 반환한다
(public member function) |
|
|
끝 부분을 가리키는 반복자를 반환한다
(public member function) |
|
요소의 개수를 반환한다. 기반(적응된) 범위가
sized_range
를 만족할 때만 제공된다
(public member function) |
|
|
(C++26)
|
결과
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)
|
|
파생된 뷰의 데이터 주소를 얻는다. 반복자 타입이
contiguous_iterator
를 만족할 때만 제공된다
(
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)
|
|
추론 가이드
헬퍼 템플릿
|
template
<
class
T
>
constexpr
bool
enable_borrowed_range
<
std
::
ranges
::
common_view
<
T
>>
=
|
(C++20 이후) | |
ranges::enable_borrowed_range
의 이 특수화는 기본 뷰가 이를 만족할 때
common_view
가
borrowed_range
를 만족하도록 합니다.
참고 사항
common_view
는 반복자와 센티넬이 동일한 타입일 것을 기대하는 레거시 알고리즘과 작업할 때 유용할 수 있습니다.
예제
#include <initializer_list> #include <iostream> #include <iterator> #include <list> #include <numeric> #include <ranges> int main() { auto v1 = {1, 2, 3, 4, 5}; auto i1 = std::counted_iterator{v1.begin(), std::ssize(v1)}; auto r1 = std::ranges::subrange{i1, std::default_sentinel}; // auto e1 = std::accumulate(r1.begin(), r1.end(), 0); // 오류: "common range" 필요 auto c1 = std::ranges::common_view{r1}; std::cout << "accumulate: " << std::accumulate(c1.begin(), c1.end(), 0) << '\n'; // ranges::view_interface에서 상속됨: std::cout << "c1.front(): " << c1.front() << '\n'; std::cout << "c1.back(): " << c1.back() << '\n'; std::cout << "c1.data(): " << c1.data() << '\n'; std::cout << "c1[0]: " << c1[0] << '\n'; auto v2 = std::list{1, 2, 3, 4, 5}; auto i2 = std::counted_iterator{v2.begin(), std::ssize(v2)}; auto r2 = std::ranges::subrange{i2, std::default_sentinel}; // auto e2 = std::accumulate(r2.begin(), r2.end(), 0); // 오류: "common range" 필요 auto c2 = std::ranges::common_view{ r2 }; std::cout << "accumulate: " << std::accumulate(c2.begin(), c2.end(), 0) << '\n'; // ranges::view_interface에서 상속됨: std::cout << "c2.front(): " << c2.front() << '\n'; // auto e3 = c2.back(); // 오류: "bidirectional range" 필요 // auto e4 = c2.data(); // 오류: "contiguous range" 필요 // auto e5 = c2[0]; // 오류: "random access range" 필요 }
가능한 출력:
accumulate: 15 c1.front(): 1 c1.back(): 5 c1.data(): 0x7f19937f00d0 c1[0]: 1 accumulate: 15 c2.front(): 1
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3494 | C++20 |
common_view
는 절대
borrowed_range
가 아니었음
|
기본 뷰가
borrowed_range
인 경우에는
borrowed_range
임
|
참고 항목
|
(C++20)
|
범위가 동일한 반복자와 센티넬 타입을 가짐을 명시
(concept) |
|
(C++20)
|
반복자 타입과 그 센티넬을 공통 반복자 타입으로 적응
(class template) |