在C+中的向量上迭代+;并动态更改值 我写了一个C++方法,它取一个T型向量VEC,并返回一个“δ”向量,即向量Vc(i)-VEC(I-1)在i位置,i>0/i,将元素设为0,与在1/./p>的元素相同。

在C+中的向量上迭代+;并动态更改值 我写了一个C++方法,它取一个T型向量VEC,并返回一个“δ”向量,即向量Vc(i)-VEC(I-1)在i位置,i>0/i,将元素设为0,与在1/./p>的元素相同。,c++,vector,C++,Vector,为此,我首先复制向量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

为此,我首先复制向量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-1,它就可以正常工作了。另一个问题是程序失败而没有显示错误(它弹出一个“main.exe已停止工作”的窗口)。我正在使用CLion IDE


请注意,我正在从main传递一个带有双值的初始化向量。

这是未定义的行为。当您将迭代器设置为result.end()时,您正在将结束迭代器解引用到向量,该向量本质上是直接位于向量之后的内存区域。不同的函数(如std::prev或解引用运算符)可能会以不同方式处理此问题。若要消除此行为,请尝试此循环:

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

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

这是未定义的行为。当您将迭代器设置为result.end()时,您正在将结束迭代器解引用到向量,该向量本质上是直接位于向量之后的内存区域。不同的函数(如std::prev或解引用运算符)可能会以不同方式处理此问题。若要消除此行为,请尝试此循环:

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


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

调试器告诉您什么?警告:003EAF20处的堆块在003EB258处修改,超过请求的3300大小。您的程序无效。您无法取消引用
.end()
iterator。有时,未定义行为的症状是它似乎可以工作。但是,您仍然不能取消引用结束迭代器,因此停止这样做。这不是您正在实现的std::Nexture_差异的限制版本吗?调试器告诉您什么?警告:003EAF20处的堆块在003EB258处修改超过请求的330大小您的程序无效。无法取消对
.end()的引用
iterator。有时,未定义行为的症状是它似乎可以工作。但是,您仍然不能取消引用超过结束迭代器的内容,所以请停止这样做。您正在实现的是std::Nexture_差异的受限版本吗?现在我明白了!谢谢!直到现在我都这么认为。end()指向向量的最后一个初始化值,这就是我产生混淆的原因。IMHO当以相反顺序迭代时,最好使用
反向迭代器,例如
for(auto i=result.rbegin();i!=result.rend()-1;++i){*i=*i-*std::next(i);}
@JonathanWakely您可能指的是*(i+1)=*(i+1)-*因为这不是我想要的向后差。在这种情况下,我们应该以result.rend()-2结尾。@Veliko不,我是说我写的。当使用
反向迭代器时,容器中的前一个元素是迭代器遍历顺序的下一个位置。@JonathanWakely我不知怎么错过了“反向迭代器”在你之前的评论中有一部分。谢谢你的努力。现在我明白了!谢谢!直到现在我还以为.end()指向向量的最后一个初始化值,这就是我的困惑所在。IMHO当以相反顺序迭代时,最好使用
反向迭代器
,例如
for(auto I=result.rbegin());i!=result.rend()-1;++i{*i=*i-*std::next(i);}
@JonathanWakely您可能指的是*(i+1)=*(i+1)-*i,因为这不是我想要的向后差异。在这种情况下,我们应该以result.rend()结束-2.@Veliko不,我的意思是我写的。当使用
反向迭代器时,容器中的上一个元素是迭代器遍历顺序中的下一个位置。@JonathanWakely我不知怎么错过了你之前评论中的“反向迭代器”部分。谢谢你的努力。