0

在下面的小示例中,我试图通过连续元素之间的差异为 1 对元素进行分组。但是,正如输出所示,group_by在当前元素和正在处理的组的第一个元素之间评估 ' 的谓词。

#include <iostream>
#include <range/v3/view/group_by.hpp>

int main() {
    using ranges::views::group_by;
    std::vector<int> v{1,2,3,6,7,8,9,12,14,15};
    for (auto i : v | group_by([](auto x2,auto x1){ return x2 - x1 == 1; })) {
        std::cout << i << '\n';
    }
}

Range-v3 是否提供了一种方法来评估组的连续元素之间的谓词?

我曾经对 Haskell 提出过同样的问题,结果发现 Hackage 上有一个同名函数

4

1 回答 1

0

这是我尝试组合 Range-v3 中已有的内容以获得我想要的东西的丑陋结果。

#include <iostream>
#include <range/v3/view/group_by.hpp>
#include <range/v3/view/transform.hpp>
#include <range/v3/view/iota.hpp>
#include <range/v3/view/concat.hpp>
#include <range/v3/view/zip_with.hpp>

constexpr auto elem_and_distance_from_previous
    = [](int x, int y){ return std::make_pair(x,x - y); };
constexpr auto second_is_1 = [](auto,auto x){ return x.second == 1; };
constexpr auto get_first = [](auto x){ return x.first; };

using namespace ranges::views;
int main() {
    std::vector<int> v{1,2,3,6,7,8,9,12,14,15};
    auto w = zip_with(elem_and_distance_from_previous,v,concat(iota(0,1),v))
           | group_by(second_is_1)
           | transform([](auto x){ return x | transform(get_first); });
    std::cout << w << '\n';
}
// outputs [[1,2,3],[6,7,8,9],[12],[14,15]]

可能正如@einpoklum 在评论中所建议的那样,对原件进行复制粘贴编辑group_by会好得多。但是我问了这个问题,因为我想知道 Range-v3 中是否已经有一种方法可以实现我的意思。

于 2021-01-31T10:19:01.177 回答