2017-03-29 9 views
0

범위 라이브러리가 표준에 포함되기 때문에 잠시 동안 놀고 있었고 매우 기본적인 개념에 몇 가지 문제가 있습니다. range-v3의 shuffle 액션

내가 고민하고 장난감 예

은 이것이다 :

#include <iostream> 
#include <range/v3/all.hpp> 
using namespace ranges; 


int main (int argc, char const* argv[]) { 
    auto v = view::iota(1, 10); 
    std::default_random_engine gen; 
    auto t = action::push_back(view::iota(0, 10)) | action::shuffle(gen); 
    std::cout << t << "\n"; 
} 

이 종류의 인쇄 가능한 그 t 정말 적절한 범위가 아닙니다 나에게 제안되지 않는다는 사실. 불행히도 문서 (있는 곳)는 실제로 자동차를 남용하므로 어떤 일이 일어나는지 알지 못합니다. 내가해야할 일, 왜해야합니까 (그리고 누구나 알고있는 경우 : 결과 유형을 문서화하는 방법은 무엇입니까 (imo 프록시 객체 및 자동은 잘 섞이지 않습니다. 예를 들어 Eigen 라이브러리를 참고하십시오).)).

내 두 번째 질문은 cargo-culted action :: push_back과 관련됩니다. 만약 내가 그것을 생략하면 나는 이오타 생성 된 뷰가 변경 가능해야한다는 것을 알려주는 개념 오류를 얻는다. 분명히보기는 디자인 상 불변하므로 여기에 문제가 생기지 만 실제로 아무것도 변경할 필요가 없으며 실제로 변경 가능한/상태 저장 객체로 들어갈 때 선호되는 방법입니까 아니면 대안이 있습니까?

최저

, 리처드

+0

범위 라이브러리를 사용하지 않지만 iam도 관심이 있습니다. 컴파일러 진단을 입력 할 수 있습니까? 반복기가 느리게 생성됩니다. 그래서 데이터가 벡터처럼 존재하지 않기 때문에 view :: iota를 섞어서는 안된다. 당신은 view :: iota로부터 vector를 생성하려고 시도 했습니까? –

+0

push_back이 정확히 수행하고 있습니다. 나는 그것이 그것이 표준적인 방법인지 궁금해하고 있었다. 범위 라이브러리 뒤에있는 아이디어는 일반적으로 스트림/스트림 융합이라고합니다. 어떤 시점에서 (의도적으로 끝) 구현 단계 (실제로 실행 및 작성)가있을 때까지는 게으른 컨테이너 작업을 수행합니다. 증상은 일반적으로 몇 배 또는 일부 사본을 사용하여 수행됩니다. :: push_back은 후자에 대한 (주관적으로) 이상한 선택 인 것 같습니다. 그러므로 제 두 번째 질문입니다. 궁극적으로 저는 잘못된 행동을 해석하고 있었기 때문에 Caleth의 대답이 실제로 도움이되었습니다. –

+1

동작은보기가 아닌 컨테이너에서 작동합니다. 'iota_view' 콘크리트를 만들어야합니다. 'to_vector '와 함께 - 셔플에 전달하기 전에. [auto container = view :: iota (1, 10) | to_vector | action :: shuffle (gen);'] (https://wandbox.org/permlink/mQBa6v6szm5XnZ7j). – Casey

답변

3

귀하의 t 인스턴스는 액션이 ​​아닌 범위입니다. 그게 << 수없는 주된 이유입니다.

여러 개의 컨테이너에 적용하여 볼 수 있습니다 (예 :

#include <iostream> 
#include <experimental/iterator> 
#include <range/v3/all.hpp> 
using namespace ranges; 


int main (int argc, char const* argv[]) { 
    std::default_random_engine gen; 
    auto t = action::push_back(view::iota(0, 10)) | action::shuffle(gen); 
    auto v1 = std::vector<int>{} | t; 
    auto v2 = std::vector<int>{} | t; 
    auto v3 = std::vector<int>{} | t; 
    auto v4 = std::vector<int>{} | t; 
    std::copy(v1.begin(), v1.end(), std::experimental::make_ostream_joiner(std::cout, ", ")); 
    std::cout << "\n"; 
    std::copy(v2.begin(), v2.end(), std::experimental::make_ostream_joiner(std::cout, ", ")); 
    std::cout << "\n"; 
    std::copy(v3.begin(), v3.end(), std::experimental::make_ostream_joiner(std::cout, ", ")); 
    std::cout << "\n"; 
    std::copy(v4.begin(), v4.end(), std::experimental::make_ostream_joiner(std::cout, ", ")); 
    std::cout << "\n"; 
} 
+0

''{std :: vector ' –

+0

아! push_back 작업을보기 <-> 작업 변환으로 해석했지만 빈 컨테이너를 수정하는 작업으로 볼 때이 작업은 실제로 두 가지 질문에 모두 응답합니다. 문제는 유형이 아닌 행동에 대한 (해석적인) 관점의 문제였습니다. –