gpt4 book ai didi

c++ - 在 C++ 中迭代 vector 并动态更改值

转载 作者:行者123 更新时间:2023-11-27 23:53:48 26 4
gpt4 key购买 nike

我正在编写一个 C++ 方法,它采用 T 类型的 vector vec 并返回一个“delta” vector ,即在位置 i 处具有元素 vec(i)-vec(i-1) 的 vector ,i>0/I set 0 处的元素与 1/处的元素相同。

为此,我首先复制 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 - *(std::prev(i));
}

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

线路好像有问题

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

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

附言从主体开始,我传递了一个具有 double 值的初始化 vector 。

最佳答案

这是未定义的行为。当您将迭代器设置为 result.end() 时,您正在将结束迭代器取消引用到您的 vector ,这实际上是内存中紧跟在您的 vector 之后的区域。不同的函数(如 std::prev 或取消引用运算符)可能以不同方式处理此问题。要消除此行为,请尝试以下循环:

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

这个循环简单地从 vector 中的最后一个有效位置(结束迭代器 -1)开始。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com