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

ahy6op9u  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(64)

std::adjacent_find查找满足给定 predicate 的前两个连续元素。我正在寻找其他算法,这些算法也有一个 predicate ,接受(前一个,当前)对。这对于渲染多边形,基于样本数据计算数值求积等很有用。
除了std::adjacent_find之外,还有std::adjacent_difference,它可以用来实现一维过滤器,但如果你只想要op(previous,current)的总和,它就没有用了。
这样的函数可以用std::ranges中的某种视图来模拟吗?

xt0899hw

xt0899hw1#

这里没有特殊的函数,因为你可以直接调用二进制转换std::transform(c.begin(), std::prev(c.end()), std::next(c.begin()), op),它适用于重叠的范围[c.begin(), c.end()-1][c.begin()+1, c.end()]
类似地,采用两个输入范围的其他操作可以在两个重叠的范围上工作,只要它们不修改输入。
这也适用于大于+/-1的差异。应该注意的是,这对输入迭代器不起作用-它们是一次通过的。

ux6nzvsh

ux6nzvsh2#

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

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

字符串
显然,也提供了相应的std::views::adjacent_transform<N>视图,它将返回将给定的N-nary函数应用于每个N-tuple的结果视图:

for (auto i: v|adjacent_transform<3>(
[](T a, T b, T c) { return /*...*/; })) {...}

相关问题