Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何组合变换、联接和循环?_C++_C++17_Range V3 - Fatal编程技术网

C++ 如何组合变换、联接和循环?

C++ 如何组合变换、联接和循环?,c++,c++17,range-v3,C++,C++17,Range V3,我试图使用range-v3库生成无限范围的整数。我的目标是有{0,0,0,1,1,1,2,2,0,0,0,1,1,1…}。 我希望每个数字重复的次数也是可变的。没有这个限制,我可以这样做,而且效果很好 const std::vector<std::vector<int>> repvec = { {0,0,0},{1,1,1},{2,2,2} }; auto joinedVec = repvec | ranges::view::join; auto infiniteVec

我试图使用range-v3库生成无限范围的整数。我的目标是有{0,0,0,1,1,1,2,2,0,0,0,1,1,1…}。 我希望每个数字重复的次数也是可变的。没有这个限制,我可以这样做,而且效果很好

const std::vector<std::vector<int>> repvec = { {0,0,0},{1,1,1},{2,2,2} };
auto joinedVec = repvec | ranges::view::join;
auto infiniteVec = joinedVec | ranges::view::cycle;
const std::vector repvec={{0,0,0},{1,1,1},{2,2,2};
自动连接vec=repvec | ranges::view::join;
自动无穷远=联合向量|范围::视图::循环;
但是如果我想要可变的重复次数,我不能让它编译:

int nbRep = 3;
const std::vector<int> origVec = { 0, 1, 2 };
auto repVec = origVec | ranges::view::transform( [nbRep] (const int &x) { 
    return ranges::view::repeat(x) | ranges::views::take(nbRep); 
});
auto joinedVec = repVec | ranges::view::join;
auto infiniteVec = joinedVec | ranges::view::cycle;
int nbRep=3;
const std::vector origVec={0,1,2};
auto repVec=origVec | ranges::view::transform([nbRep](const int&x){
返回范围::视图::重复(x)|范围::视图::获取(nbRep);
});
自动连接vec=repVec | ranges::view::join;
自动无穷远=联合向量|范围::视图::循环;

我不确定这是否是范围库的限制,或者我是否做错了什么。

我真的不明白你为什么要这样做:

ranges::view::repeat(x) | ranges::views::take(nbRep)
而不仅仅是:

ranges::view::repeat_n(nbRep)
解决方案非常简单:

auto generate_range(const std::vector<int>& original, const std::size_t reps) {
    using namespace ranges; 

    auto rng = original | views::transform([reps](const auto arg) {
        return views::repeat_n(arg, reps);
    });

    return rng | views::cycle | views::join;
}
现在我们只需要循环所有元素。我们最终得到:

rng | cycle = [[0, 0, 0], [1, 1, 1], [2, 2, 2], [0, 0, 0], [1, 1, 1], ...]
我们需要做的最后一件事是加入他们:

rng | cycle | join = [0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, ...]
完整示例:

#include <iostream>
#include <range/v3/all.hpp>
#include <vector>

auto generate_range(const std::vector<int>& original, const std::size_t reps) {
    using namespace ranges;

    auto rng = original | views::transform([reps](const auto arg) {
        return views::repeat_n(arg, reps);
    });

    return rng | views::cycle | views::join;
}

int main() {
    using namespace ranges;

    const std::vector<int> original = {0, 1, 2};
    const int reps = 3;

    for (const auto r : generate_range(original, reps) | ranges::views::take(15)) {
        std::cout << r << ' ';
    }
}
#包括
#包括
#包括
自动生成范围(常量标准::向量和原始,常量标准::大小重复){
使用名称空间范围;
自动rng=原始|视图::转换([reps](常量自动参数){
返回视图::重复(arg,reps);
});
返回rng |视图::循环|视图::加入;
}
int main(){
使用名称空间范围;
const std::vector original={0,1,2};
const int reps=3;
对于(常量自动r:generate_range(原始,重复)| ranges::views::take(15)){

std::cout为什么只为一个
向量使用双大括号?
?你也应该能够不使用中间变量。@Davidsherring同意,这是没有必要的。修复了它。它确实解决了我的问题。但我仍然想知道为什么交换循环和连接会使它无法编译。从技术上讲,我认为它也应该可以做到“rng | join | cycle”,但它不是。@jslap好问题。我没有答案,但我在range-v3的存储库中填写了一个。让我们等待知道的人。
#include <iostream>
#include <range/v3/all.hpp>
#include <vector>

auto generate_range(const std::vector<int>& original, const std::size_t reps) {
    using namespace ranges;

    auto rng = original | views::transform([reps](const auto arg) {
        return views::repeat_n(arg, reps);
    });

    return rng | views::cycle | views::join;
}

int main() {
    using namespace ranges;

    const std::vector<int> original = {0, 1, 2};
    const int reps = 3;

    for (const auto r : generate_range(original, reps) | ranges::views::take(15)) {
        std::cout << r << ' ';
    }
}