对相邻元素进行操作的标准算法

问题描述 投票:0回答:2

std::adjacent_find
查找满足给定谓词的前两个连续元素。我正在寻找其他算法,它们也有一个采用(先前的、当前的)对的谓词。这对于渲染多边形、基于样本数据计算数值求积等很有用。

除了

std::adjacent_find
之外,还有
std::adjacent_difference
,它可以用来实现一维过滤器,但如果你只想要op(previous, current)的和,则没有用。

可以使用 std::ranges 中的某种视图来模拟此类函数吗?

c++ stl-algorithm std-ranges
2个回答
3
投票

没有特殊的函数,因为你可以调用二进制变换

std::transform(c.begin(), std::prev(c.end()), std::next(c.begin()), op)
。这适用于重叠范围
[c.begin(), c.end()-1]
[c.begin()+1, c.end()]

类似地,采用两个输入范围的其他操作也可以在两个重叠范围上运行,只要它们不修改输入即可。

这也适用于大于 +/-1 的差异。应该注意的是,这不适用于输入迭代器 - 它们是一次性的。


0
投票

自 C++23 起,就有

std::views::adjacent<N>
根据
N-tuple
的视图重新解释给定范围。这是一个强大的工具,具有结构化绑定,允许您遍历具有命名类字段的范围。例如。如果 N==2,

std::vector v{...};
for (auto [former, latter]: v|adjacent<2>){...}

显然还提供了相应的

std::views::adjacent_transform<N>
视图,它将返回将给定的 N 元函数应用于每个 N 元组的结果视图。

© www.soinside.com 2019 - 2024. All rights reserved.