首页 > 解决方案 > 如何修改 std::adjacent_difference 以仅给出差异?

问题描述

的文档std::adjacent_difference说写入输出的第一个元素是输入的第一个元素,没有改变。对于我的用例,我想删除第一个元素。我的问题是,什么是最易读且效率最高的方法?

例如, given [1, 3, 7],std::adjacent_difference将给出,[1, 2, 4]但第一个元素实际上并没有区别,它只是我们已经拥有的第一个 1。

目前,我已经复制了参考实现并将其修改为不写入第一个元素,并在递增输出迭代器之前而不是之后在循环中执行写入:

template<class InputIt, class OutputIt>
constexpr
OutputIt adjacent_difference(InputIt first, InputIt last, 
                             OutputIt d_first)
{
    if (first == last) return d_first;
 
    typedef typename std::iterator_traits<InputIt>::value_type value_t;
    value_t acc = *first;
    while (++first != last) {
        value_t val = *first;
        *d_first++ = val - std::move(acc); // <-- previously *++d_first = ...
        acc = std::move(val);
    }
    return d_first;
}

这可行,但当然不是很令人满意,因为它复制了现有算法的代码。是否可以制作一个忽略第一次写入和增量的插入器?这会产生什么性能成本?

标签: c++functional-programmingiterator

解决方案


是否可以制作一个忽略第一次写入和增量的插入器?

是的。

这会产生什么性能成本?

在最简单的实现中:在最坏的情况下检查每次写入。使用间接可以避免检查,但我不认为间接更有效。


关于您的自定义算法,我认为回报不应增加:return d_first;


推荐阅读