C++ 我如何修改std::相邻_差异以仅给出差异?

C++ 我如何修改std::相邻_差异以仅给出差异?,c++,functional-programming,iterator,C++,Functional Programming,Iterator,的文档说明,写入输出的第一个元素是输入的第一个元素,没有改变。对于我的用例,我想删除第一个元素。我的问题是,做这件事的最具可读性的方法是什么,也是最高效的 例如,给定[1,3,7],std::nexture_difference将给出[1,2,4],但第一个元素实际上不是一个差异,它只是我们已经拥有的第一个1 目前,我复制并修改了它,使其不写入第一个元素,并在递增输出迭代器之前而不是之后执行循环写入: template<class InputIt, class OutputIt> c

的文档说明,写入输出的第一个元素是输入的第一个元素,没有改变。对于我的用例,我想删除第一个元素。我的问题是,做这件事的最具可读性的方法是什么,也是最高效的

例如,给定
[1,3,7]
std::nexture_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;
}
模板
常量表达式
输出相邻_差(先输入,后输入,
输出(第一)
{
if(first==last)首先返回d_;
typedef typename std::迭代器特征::值\u type值\u t;
值_t acc=*第一;
而(++第一个!=最后一个){
value_t val=*第一;
*d_first++=val-std::move(acc);//
是否可以使插入器忽略第一次写入和增量

这会产生什么性能成本

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



关于您的自定义算法,我认为返回值不应该递增:
return d_first;

输出到哪里去了?您可以忽略第一个元素吗?如果您想知道不同方法的性能成本,请实现并分析它们。@JohnZwinck这更像是一个原则问题;有什么方法可以调整吗该算法是以零成本抽象的方式实现的?具体来说,是否有可能生成一个输出迭代器类型,从而导致编译器省略第一个
*d_first=acc;
?@TamaMcGlinn编写自己的输出迭代器似乎比编写修改后的
相邻的
更难,需要更多的样板文件。为什么要这样做这比您当前的解决方案要好???@Jarod42可以应用于输出迭代器吗?您是正确的;返回值应该是最后一次写入之后的元素,所以只需先使用d_。谢谢