2017-04-02 16 views
1

연결을 위해 기존보기를 사용하고 싶습니다. 코드에서 :두 개의 기존 범위를 연결하는 방법 ::보기?

auto rng = view::empty<vector<int>>(); 

for(int i{0}; i < 5; ++i) 
{ 
    vector<int> const & v{foo()}; // returns a reference 
    rng |= view::concat(v); // doesn't compile - error: no viable overloaded '|=' 
}; 

다른 말로하면 - 실행 시까 지 번호가 알려지지 않은 여러 벡터에 대한보기를 만들려면 어떻게해야합니까?

+0

을'무엇 유형 newRange' 그리고'foo()'함수를 볼 수 있습니까? 또한'v'는 무엇입니까? – Galik

+0

@Galik 코드를 업데이트했습니다. 'foo()'함수는 const 참조를 반환하지만 그것은 내 질문과 관련이 없습니다. – nikitablack

+0

범위와 관련해서는 상당히 어렵다고 생각합니다. 다른 요소가있는 n 개의 범위를 고려하십시오. 이제 전체 범위의 begin() 및 end()가 첫 번째의 begin()을 시작하고 end()의 마지막 점을 가리키며 그 사이에 우리가 k 번째 범위의 끝에 있는지 여부를 추적해야합니다. (k + 1) 번째로 이동. 컴파일 타임에''view :: concat''는 상당히 많은 기계 장치를 가지고 이것을 달성합니다. – skgbanga

답변

2

이렇게하면보기를 작성할 수 없습니다. 뷰를 연결하면 다른 유형의 객체가 생성됩니다. 유형이 다르므로 원래보기에 다시 지정할 수 없습니다.

당신은 view::cycle의 조합으로 후하고있는 효과를 얻을 수는 (한 범위를 취하고 무한으로 반복), 및 view::take는 (범위의 첫 번째 N 요소 소요). foo() 다른 벡터에 때마다 참조를 반환 할 경우

vector<int> const & v{foo()}; // returns a reference 
auto rng = v | view::cycle | view::take(5 * v.size()); 

편집

, 당신은 view::take 이외에 view::generateview::join을 사용할 수 있습니다

auto rng = view::generate(foo) | view::take(5) | view::join; 
+0

'foo()'가 여러 호출에서 다른 벡터를 반환하면 원하는 결과를 얻을 수 없습니다. – Caleth

+0

@Eric 이것을 지울 수있는 타입 반복자 범위로 할 수 있습니까? (이것은 range-v3 라이브러리 코드의 변경을 필요로합니다). 그러나 기본적으로 우리는 시작/끝이있는 범위를 가지며 내부적으로 시작 및 끝 값의 목록/zip을 유지합니다. iterating하는 동안 k 번째 범위를 추적하고 끝에 k + 1 번째로 이동합니다. Btw, 이것은 deque 구현 방법과 매우 비슷합니다. 그리고 RandomAccessIterator를 모델링 할 수 있습니다. 이 모든 것이 유용할지 여부는 다른 문제입니다. – skgbanga

+0

@Caleth 답변을 업데이트했습니다. 감사합니다. –