Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++从现有向量计算一个具有增量的向量 我正在学习C++ STL算法。我需要帮助,试图找到一个函数,从现有向量中的值创建一个delta向量。换言之: delta0=吸收系数1-原始值0 delta1=吸收系数2-原始值1 等等_C++_Algorithm_Vector_Stl - Fatal编程技术网

C++从现有向量计算一个具有增量的向量 我正在学习C++ STL算法。我需要帮助,试图找到一个函数,从现有向量中的值创建一个delta向量。换言之: delta0=吸收系数1-原始值0 delta1=吸收系数2-原始值1 等等

C++从现有向量计算一个具有增量的向量 我正在学习C++ STL算法。我需要帮助,试图找到一个函数,从现有向量中的值创建一个delta向量。换言之: delta0=吸收系数1-原始值0 delta1=吸收系数2-原始值1 等等,c++,algorithm,vector,stl,C++,Algorithm,Vector,Stl,我在寻找一些简洁的东西,比如这里提到的R的diff函数: 我找到了transform函数,但它似乎一次只在一个元素上运行。它似乎不允许提供的函数中的迭代器参数进行转换,因此我仅限于当前元素。我正在尝试学习STL算法,所以我不需要任何可能已经实现了diff的库。如果有一种简洁的方法我不知道的话,我想看看使用STL函数来解决这个问题的方法 下面是一个示例,该部分已被注释: #include <iostream> #include <vector> using namespa

我在寻找一些简洁的东西,比如这里提到的R的diff函数:

我找到了transform函数,但它似乎一次只在一个元素上运行。它似乎不允许提供的函数中的迭代器参数进行转换,因此我仅限于当前元素。我正在尝试学习STL算法,所以我不需要任何可能已经实现了diff的库。如果有一种简洁的方法我不知道的话,我想看看使用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;
}
您只是错过了transform的第二个版本。看一看


看到代码在运行

据我所知,没有diff函数,像你这样循环有什么不对?很可能r就是这样做的。你需要更高的速度吗?你推测的算法几乎是匹配的。此函数的不同之处在于,第一个结果是集合的第一个元素,不作更改。这只是一个学习练习。看起来转换很近,所以我觉得我错过了什么。是的,相邻的差异看起来也不错。谢谢,非常感谢。这就是我要找的。我还在学习转换。@jlim只需看看那些可能的实现,就可以让理解比10句话容易得多
std::transform(std::next(v.begin()), v.end(),
               v.begin(), delta.begin(),
               [](int a, int b){ return std::abs(a - b); });