【问题标题】:c++ computing a new vector which has deltas from an existing vectorc ++计算一个新向量,该向量具有现有向量的增量
【发布时间】:2015-07-24 22:16:52
【问题描述】:

我正在学习 C++ STL 算法。我需要帮助试图找到一个函数来从现有向量中的值创建一个增量向量。换句话说:

  • delta0 = abs(original1 - original0)
  • delta1 = abs(original2 - original1)
  • 等等。

我正在寻找简洁的东西,比如这里提到的 R 的“diff”函数: computing a new vector which has deltas from an existing vector

我找到了转换函数,但它似乎一次只对一个元素进行操作。它似乎不允许提供给 transform 的函数中的迭代器参数,所以我仅限于当前元素。我正在尝试学习 STL 算法,所以我真的不需要任何可能实现了“差异”的库。如果有一种我不知道的简洁方法,我只想看看一种使用 STL 函数来解决这个问题的方法。

这是一个示例,其中有问题的部分已评论:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v = { 1, 2, 3, 4, 5 };
    vector<int> delta;

    //---------------------------------------
    // way to do this with STL algorithms?
    for (auto i = v.begin()+1; i != v.end(); i++) {
        delta.push_back(abs(*i - *(i - 1)));
    }
    //---------------------------------------
    for (int i : delta) {
        cout << i << " ";
    }
    return 0;
}

【问题讨论】:

  • 没有我知道的diff 函数,按照你的方式循环它有什么问题? r 很可能就是这样做的。您需要更快的速度吗?
  • 您推测的算法几乎匹配std::adjacent_difference。此函数的不同之处仅在于第一个结果是您的集合的第一个元素,没有改变。
  • 这只是一个学习练习。看起来变换很接近,所以我觉得我错过了一些东西。
  • 是的,similar_difference 看起来也不错。谢谢。

标签: c++ algorithm vector stl


【解决方案1】:
std::transform(std::next(v.begin()), v.end(),
               v.begin(), delta.begin(),
               [](int a, int b){ return std::abs(a - b); });

您只是错过了transform 的第二个版本。看看here

查看运行中的代码online

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多