【问题标题】:Iterating over a vector in C++ and changing the values dynamically迭代 C++ 中的向量并动态更改值
【发布时间】:2017-05-24 15:48:24
【问题描述】:

我正在编写一个 c++ 方法,它采用 T 类型的向量 vec 并返回一个“delta”向量,即在位置 i 处具有元素 vec(i)-vec(i-1) 的向量,i>0 /I set 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。

附:从主我传递一个带有双值的初始化向量。

【问题讨论】:

  • 你的调试器告诉你什么?
  • 警告:003EAF20 处的堆块在 003EB258 处修改,请求大小超过 330
  • 您的程序无效。您不能取消引用 .end() 迭代器。
  • 有时未定义行为的症状是它似乎有效。但是,您仍然不能取消引用过去的迭代器,所以停止这样做。
  • 这不是您正在实施的 std::adjacent_difference 的受限版本吗?

标签: c++ vector


【解决方案1】:

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

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

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

【讨论】:

  • 现在我明白了!谢谢!到目前为止,我认为 .end() 指向向量的最后一个初始化值,这就是我的困惑所在。
  • 恕我直言,当以相反的顺序迭代时,最好使用reverse_iterator,例如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 不,我的意思是我写的。当使用reverse_iterator 时,容器中的前一个元素是迭代器遍历顺序中的下一个位置。
  • @JonathanWakely 我不知何故错过了您之前评论中的“reverse_iterator”部分。感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 2020-08-08
  • 2016-09-20
  • 2016-03-16
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多