我正在编写一个c ++方法,该方法采用类型T的向量vec并返回一个“增量”向量,即在位置i,i> 0处具有元素vec(i)-vec(i-1)的向量,将元素设置为0与1 /相同。

为此,我首先复制向量vec,然后以这种方式进行迭代:

template<class T>
vector<T> delta(vector<T> vec){
    vector<T> result(vec);
    for (typename vector<T>::iterator i = result.end(); i >= result.begin()+1; i--)
        {
            *i = *i - *(std::prev(i));
        }

    result.at(0) = result.at(1);
    return (result);
}


这条线似乎有问题

*i = *i - *(std::prev(i));


我不明白。如果我将其更改为* i = * i-1,则效果很好。另一个问题是该程序只是失败而没有显示我错误(它弹出“ main.exe已停止工作”的窗口。我正在使用CLion IDE。

附言从主要方面,我正在传递带有双精度值的初始化向量。

最佳答案

这是未定义的行为。当将迭代器设置为result.end()时,您将向向量取消引用结束迭代器,该向量实际上是紧接在向量之后的内存区域。诸如std :: prev或解引用运算符之类的不同函数可能会对此进行不同的处理。要消除这种现象,请尝试以下循环:

for (typename std::vector<T>::iterator i = result.end()-1; i >= result.begin()+1; i--) {
         *i = *i - *(i-1);
}


该循环仅从向量中的最后一个有效位置开始(结束迭代器-1)。

关于c++ - 在C++中迭代 vector 并动态更改值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44163133/

10-13 08:34