gpt4 book ai didi

c++ - 如何使用 range-v3 成对地转换范围?

转载 作者:行者123 更新时间:2023-11-27 22:46:08 26 4
gpt4 key购买 nike

我正在编写一个算法来删除重叠,给定一系列线(由于在这种情况下术语“范围”的歧义,我将其称为“线”)。

这是的样子:

struct line {
int begin, width;
int end() const { return begin + width; }
};

示例:给定三行 (0,3)、(1,2) 和 (5,1),我希望获得 (0,3)、(3,2) 和 (5) ,1)改造后。这是此问题的图形表示:

Overlap Removal

这是该问题的一种可能解决方案:

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);
}

Demo

关于c++ - 如何使用 range-v3 成对地转换范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42683389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com