【发布时间】:2021-05-04 17:50:17
【问题描述】:
在下面的小示例中,我试图通过连续元素之间的差异为 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 是否提供了一种方法来评估组中连续元素之间的谓词?
我曾经问过the same question for Haskell,结果是namesake function is on Hackage。
【问题讨论】:
-
我推测这不存在。但是 - 你不能自己写吗?此外,当并非所有元素都需要满足相同的标准时,我不会将其称为
group_by而是其他名称。 -
@einpoklum,我希望现在更清楚了。在我的意图中,每个组中的所有元素都必须是组中的前一个元素 + 1。好吧,整个向量上的第一个元素没有前一个元素......
-
其实问题已经很清楚了,我只是提个建议。取group_by的源,from here,改
Pred结构做你想做的应该不会太难。 -
这是一种不同的算法,您所描述的算法与通常认为的“分组依据”相反。我在一些函数式编程库中看到它被称为“group with”
-
@AluanHaddad,我猜如果当前的
group_by被称为group_with,那么我描述的不同算法的一个好名字可能是group_by。最后,它们只是“稍微”不同的算法的两个不同名称。至于其他 FP 语言,根据我问题中的链接,Haskell 有Data.List.groupBy(类似于ranges::views::group_by)和Data.List.GroupBy.groupBy。
标签: c++ functional-programming grouping range-v3 list-processing