我正在编写一个c ++方法,它采用类型为T的向量vec并返回一个" delta"矢量,即矢量与元素vec(i)-vec(i-1)在位置i,i> 0 / I将元素设置为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就行了。另一个问题是程序失败而没有显示我的错误(它弹出一个带有&#34的窗口; main.exe已停止工作&#34;。我正在使用CLion IDE。
P.S。从主要的我传递一个带有双值的初始化向量。
答案 0 :(得分:3)
这是未定义的行为。当您将迭代器设置为result.end()时,您将解引用向量的结束迭代器,该向量基本上是向量之后的内存区域。不同的函数(如std :: prev或dereference运算符)可能以不同的方式处理它。要消除此行为,请尝试以下循环:
for (typename std::vector<T>::iterator i = result.end()-1; i >= result.begin()+1; i--) {
*i = *i - *(i-1);
}
这个循环只是从向量中的最后一个有效位置开始(结束迭代器-1)。