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
.