我正在编写一个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/