std::adjacent_find
查找满足给定谓词的前两个连续元素。我正在寻找其他算法,它们也有一个采用(先前的、当前的)对的谓词。这对于渲染多边形、基于样本数据计算数值求积等很有用。
除了
std::adjacent_find
之外,还有std::adjacent_difference
,它可以用来实现一维过滤器,但如果你只想要op(previous, current)的和,则没有用。
可以使用 std::ranges 中的某种视图来模拟此类函数吗?
没有特殊的函数,因为你可以调用二进制变换
std::transform(c.begin(), std::prev(c.end()), std::next(c.begin()), op)
。这适用于重叠范围 [c.begin(), c.end()-1]
和 [c.begin()+1, c.end()]
。
类似地,采用两个输入范围的其他操作也可以在两个重叠范围上运行,只要它们不修改输入即可。
这也适用于大于 +/-1 的差异。应该注意的是,这不适用于输入迭代器 - 它们是一次性的。
自 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 元组的结果视图。