>백엔드 개발 >C++ >Range-V3 파이프라인을 사용하여 함수에서 반환된 벡터를 어떻게 평면화할 수 있습니까?

Range-V3 파이프라인을 사용하여 함수에서 반환된 벡터를 어떻게 평면화할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-01 06:28:30897검색

How Can I Flatten Vectors Returned from a Function Using Range-V3 Pipelines?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.