[英]How to transform a range, pair-by-pair with range-v3?
给定一定范围的行,我正在编写一种消除重叠的算法(由于这种情况下术语“范围”的歧义,我称其为“行”)。
这是一条line
样子:
struct line {
int begin, width;
int end() const { return begin + width; }
};
示例:给定三行(0,3),(1,2)和(5,1),我希望在变换后获得(0,3),(3,2)和(5,1)。 这是此问题的图形表示:
这是该问题的一种可能的解决方案:
auto removeOverlap(std::pair<line, line> input)
{
// keeps first line untouched and shifts the second line to the end of the first one, if necessary
return std::pair<line, line>{std::get<0>(input), {std::max(std::get<0>(input).end(), std::get<1>(input).begin), std::get<1>(input).width}};
}
int main(int argc, char *argv[])
{
std::array<line, 3> lines{{{0,3},{1,2},{5,1}}};
for(int i = 0; i < lines.size()-1; ++i)
{
std::tie(lines[i], lines[i+1]) = removeOverlap(std::make_pair(lines[i], lines[i+1]));
}
assert(lines[0].begin == 0);
assert(lines[1].begin == 3);
assert(lines[2].begin == 5);
我的问题:如何使用range-v3做到这一点?
我正在考虑使用修改后的view::chunk(N)
,其中增量的大小为1(而不是N)。 但是我真的不知道如何从这一点着手。
您可以这样做:
auto pair_view =
ranges::view::zip(lines | ranges::view::take(lines.size() - 1),
lines | ranges::view::drop(1));
for (auto&& p : pair_view)
{
p = removeOverlap(p);
}
auto push_highwater = [](int& highwater){
return [&](line l) {
l.begin = (std::max)(highwater, l.begin);
highwater = l.end();
return l;
};
};
将其提供给原始范围的转换视图,然后按顺序遍历转换后的视图。
从最低整数开始。 确保int寿命足够长。
实时示例 (无法找出从数组转换回自身的更简单方法...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.