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

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 라이브러리로 컴파일하여 그 가치가 있습니다.



답변

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

아니요 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.


답변