범위 라이브러리가 표준에 포함되기 때문에 잠시 동안 놀고 있었고 매우 기본적인 개념에 몇 가지 문제가 있습니다. 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과 관련됩니다. 만약 내가 그것을 생략하면 나는 이오타 생성 된 뷰가 변경 가능해야한다는 것을 알려주는 개념 오류를 얻는다. 분명히보기는 디자인 상 불변하므로 여기에 문제가 생기지 만 실제로 아무것도 변경할 필요가 없으며 실제로 변경 가능한/상태 저장 객체로 들어갈 때 선호되는 방법입니까 아니면 대안이 있습니까?
최저
, 리처드
범위 라이브러리를 사용하지 않지만 iam도 관심이 있습니다. 컴파일러 진단을 입력 할 수 있습니까? 반복기가 느리게 생성됩니다. 그래서 데이터가 벡터처럼 존재하지 않기 때문에 view :: iota를 섞어서는 안된다. 당신은 view :: iota로부터 vector를 생성하려고 시도 했습니까? –
push_back이 정확히 수행하고 있습니다. 나는 그것이 그것이 표준적인 방법인지 궁금해하고 있었다. 범위 라이브러리 뒤에있는 아이디어는 일반적으로 스트림/스트림 융합이라고합니다. 어떤 시점에서 (의도적으로 끝) 구현 단계 (실제로 실행 및 작성)가있을 때까지는 게으른 컨테이너 작업을 수행합니다. 증상은 일반적으로 몇 배 또는 일부 사본을 사용하여 수행됩니다. :: push_back은 후자에 대한 (주관적으로) 이상한 선택 인 것 같습니다. 그러므로 제 두 번째 질문입니다. 궁극적으로 저는 잘못된 행동을 해석하고 있었기 때문에 Caleth의 대답이 실제로 도움이되었습니다. –
동작은보기가 아닌 컨테이너에서 작동합니다. 'iota_view' 콘크리트를 만들어야합니다. 'to_vector '와 함께 - 셔플에 전달하기 전에. [auto container = view :: iota (1, 10) | to_vector | action :: shuffle (gen);'] (https://wandbox.org/permlink/mQBa6v6szm5XnZ7j). – Casey