迭代C ++中的向量并动态更改值

时间:2017-05-24 15:48:24

标签: c++ vector

我正在编写一个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。从主要的我传递一个带有双值的初始化向量。

1 个答案:

答案 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)。