C ++ 20에서 뷰를 가진 컨테이너를 구성 할 수 있습니까?


10

C ++ 20 표준 버전으로 범위가 C ++에 제공됩니다.

내 질문 : 우리는 어떤 범위에서 (기존의) 표준 라이브러리 컨테이너를 만들 수 있습니까? 더 중요한 것은 레인지 뷰를 사용하는 것입니까?

예를 들면 다음과 같습니다.

#include <vector>
#include <iostream>
#include <ranges>

int main() {
    auto sq = [](int x) { return x * x; };
    std::vector<int> vec { 3, 4, 5 };
    std::vector<int> squares { std::ranges::views::transform(vec, sq) };
    for(auto i : squares) { std::cout << i << ' '; }
    std::cout << std::endl;
}

인쇄하는 유효한 프로그램 9 16 25입니까?

이것은 ranges-v3 라이브러리로 컴파일하여 그 가치가 있습니다.




@DavisHerring 무엇을 바꿀 수 있습니까? P1206 은 처음부터 20으로 간주되지 않았 으며 여기에 NB 의견이 남아 있다고 생각하지 않습니까? P1391 은 범위 생성자 없이 채택 되었습니다 (오해의 소지가 있음에도 불구하고).
Barry

@Barry : LEWG 는 Kona로 전달 했지만 최근 반사경 트래픽을 잘못 해석 한 것 같습니다.
Davis Herring

@DavisHerring 오, 나는 그것이 두 번 논의되었다는 것을 놓쳤다. 나는 4-7 설문 조사로 스크롤을 내려서 그 생각이었다.
Barry

답변:


8

내 질문 : 우리는 어떤 범위에서 (기존의) 표준 라이브러리 컨테이너를 만들 수 있습니까? 더 중요한 것은 레인지 뷰를 사용하는 것입니까?

아니요 std::span<T>. 올바른 기준을 충족하는 임의의 범위에서 구성 할 수있는 유일한 표준 라이브러리 구성 요소는 입니다.

표준 라이브러리가 갈 방향은 range-v3도 향한 방향입니다 (range-v3의 링크 된 예제는 컴파일되지만 더 이상 사용되지 않는 변환에 대해 경고합니다)- 도우미 를 사용하여 변환하십시오.

std::vector<int> squares =
    std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;

범위 생성자의 방향으로 가지 않는 이유 중 하나는 사용중인 바로 그 예에서 볼 수 있습니다.

std::vector<int> squares { std::ranges::views::transform(vec, sq) };

그 선언이이 두 가지와 어떻게 다른지 고려하십시오.

std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );

v반드시 것 vector<transform_view<...>>하나를 포함하는 transform_view반면,이 w될 것이다 vector<int>.

더구나 신중하게 제약 된 컨테이너 생성자를 표준 라이브러리에 추가한다고해서 타사 컨테이너 유형을 도울 수는 없습니다 ranges::to.


진술은 초기화 v되고 w나에게 동일하게 보입니다. 아마 당신은 선언하는 의미 wA와 vector<int>. 그렇지 않으면 이것이 정답입니다.
Eric Niebler

5
@EricNiebler 정확하게 :-) 그들은 똑같이 보입니다 . 그들은 동일하지 않습니다.
Barry

그래서 내 프로그램은 컴파일되지만 내가 생각하는 것을하지 않습니다. 확인.
einpoklum

1
감사합니다, CTAD ...
TC

v그리고 w다른지 설명해 주 시겠습니까? 생성자 템플릿 인수 공제 방법과 관련이 있습니까?
Johannes Schaub-litb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.