c++ - 如何修改 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;
}
这可行,但当然不是很令人满意,因为它复制了现有算法的代码。是否可以制作一个忽略第一次写入和增量的插入器?这会产生什么性能成本?
解决方案
是否可以制作一个忽略第一次写入和增量的插入器?
是的。
这会产生什么性能成本?
在最简单的实现中:在最坏的情况下检查每次写入。使用间接可以避免检查,但我不认为间接更有效。
关于您的自定义算法,我认为回报不应增加:return d_first;
推荐阅读
- python - How to allow characters and whitespaces in an exception in regex?
- javascript - 如何仅使用 Redux 管理 React 表单?没有 redux-forms
- c# - 我的 Raycast2D 在面向一侧时正在注册,但在朝着另一个方向时没有任何东西被“击中”。
- javascript - 如何将 onload 添加到 onchange 函数
- assembly - 指向 putchar 的分支链接导致 ARM 中的分段错误
- nslayoutconstraint - 在 iOS 中以编程方式设置约束使按钮消失
- python - Tkinter:将图像添加到窗口(使用画布上的create_window)
- javascript - 如何将数据从 React 发送到 NodeJS?
- java - 在 Android 应用中,如何忽略默认的应用偏好并强制用户选择应用?
- swift - 如何从网络日历访问事件数据以在移动应用程序中显示?