Range-V3을 사용하여 임시 컨테이너를 사용한 Range 파이프라이닝
문제:
요소 범위(src) 및 범위 요소를 입력으로 사용하고 벡터를 반환하는 타사 함수(f). f를 사용하여 범위의 각 요소를 변환하고 결과 벡터를 단일 범위로 평면화하려고 합니다. 그러나 view::transform 및 view::join을 직접 사용하는 것은 임시 컨테이너에 대한 뷰를 생성할 수 없기 때문에 작동하지 않습니다.
해결책:
이러한 파이프라인을 지원하려면 , range-v3에는 views::cache1 연산자가 도입되었습니다. 이 연산자를 사용하면 뷰 결과를 임시 컨테이너에 저장한 다음 해당 컨테이너의 뷰를 만들 수 있습니다. 파이프라인에 views::cache1을 포함하면 평면화된 벡터의 뷰를 생성할 수 있습니다.
auto rng = src | views::transform(f) | views::cache1 | views::join;
코드 샘플:
다음 코드 샘플은 방법을 보여줍니다. views::cache1을 사용하여 범위의 요소를 변환하고 평면화하는 범위 파이프라인을 생성하려면:
<code class="cpp">#include <range/v3/view.hpp> #include <range/v3/algorithm.hpp> #include <vector> std::vector<std::string> f(int i) { return std::vector<std::string>(i, char('a' + i)); } int main() { auto rng = views::iota(0, 4) | views::transform([](int i) { return f(i); }) | views::cache1 | views::join('-'); check_equal(rng, {'-', 'b', '-', 'c', 'c', '-', 'd', 'd', 'd'}); CPP_assert(input_range<decltype(rng)>); CPP_assert(!range<const decltype(rng)>); CPP_assert(!forward_range<decltype(rng)>); CPP_assert(!common_range<decltype(rng)>); return 0; }</code>
위 내용은 Range-V3 파이프라인을 사용하여 함수에서 반환된 벡터를 어떻게 평면화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!