我正在寫一個算法來刪除重疊,給定一個範圍的行(我稱之爲「行」,因爲在這種情況下,術語「範圍」的含糊不清)。如何轉換範圍,與範圍-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);
我的問題:我怎麼能做到這一點使用範圍-V3?
我在考慮使用修改後的view::chunk(N)
,其中增量的大小是1(而不是N)。但我真的不知道如何從這一點着手。
忍者。用'ranges :: transform'算法調用'for'循環來獲得額外的勝利。 –