c++ - 交换和重新计算给出不同的结果

标签 c++ swap

我不确定我做错了什么,但是应该给出相同结果的两个版本的代码却给出了不同的结果。如果有人能解释发生了什么,我将不胜感激。

情况如下。我正在使用数组作为“vector ”,我有一个简单的函数 sub有两个重载来计算两个 vector 之间的差异。第一个基本算出v := v - w , 而第二个计算 x := v - w .

// Subtract w[] from v[]
template <class T>
void sub(T *v, T *w, short m)
{
    for (short r = 0; r < m; r++)
        v[r] = v[r] - w[r];
}

// Subtract w[] from v[] and store result in x[]
template <class T>
void sub(T *v, T *w, T *x, short m)
{
    for (short r = 0; r < m; r++)
        x[r] = v[r] - w[r];
}

现在在某个时候我需要计算 v - w , 如果它满足某些条件,则替换 v通过 v - w .如果没有,v应该保持不变。起初我有

...
// temp := v - w
sub<T>(v, w, temp, m);
if (condition on temp)
{
    // v := v - w
    sub<T>(v, w, m);
}
...

为了提高效率,我觉得同样的东西计算两次很浪费,所以我把上面的替换成

...
// temp := v - w
sub<T>(v, w, temp, m);
if (condition on temp)
{
    // swap v and temp
    std::swap(v, temp);
}
...

变量temp实际上在之后被重用,这可能会导致问题,但每次我第一次调用 sub<T>(v, w, temp, m); (从而删除数组中的所有内容)在使用 temp 之前再次。

现在在做了上面的替换之后,我的算法结果突然变了。如果有人能解释为什么结果会改变以及发生了什么,我将不胜感激!

提前致谢。


编辑

快速检查表明,在这两种情况下,在每次迭代中,v 的最终值都是和 temp 的初始值是一样的。所以这些功能正在做他们应该做的事情......

我能想到的解释奇怪行为的唯一可能性是,出于某种原因,函数 std::swap正在使用随机性,导致不同的结果。我每次运行都使用相同的种子,每次都应该得到相同的结果,但如果 std::swap使用 rand()在某个地方,这可以解释不同的结果。但我不知道为什么这个函数会使用 rand() .

最佳答案

如果每次要使用temp时,将temp重新计算为v-w,则值会不同,当 >v不变,当v指向之前由temp指向的数组。

考虑一下:在第一种情况下,您的计算每次都是:temp=v-w。在第二种情况下:temp=v-w;交换(温度,v); temp=v-w; -- 交换后的与之前的不同,因为 v 指向的数组现在包含来自 temp-w 的值(使用交换后的指针值)。也就是说,第二个赋值等价于temp=(v-w)-w; using the original arrays

关于c++ - 交换和重新计算给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915551/

相关文章:

c++ - "unformatted input function"到底是什么意思?

c++ - 对自定义元素 vector 进行排序时的意外(至少对我而言)行为

dictionary - 在 fsharp 中交换映射中的键和值

c - C中是否有内置的交换功能?

c++ - 从 vector 中删除多个元素 C++

c++ - 在 C++ 中释放单个变量或数组之间的区别

C++ 结构 - 错误 1 ​​错误 C2143 : syntax error : missing ';' before '*'

c++ - 从 QGridLayout 中删除 QWidgets

python - 使用 Python 交换同一列表中的子集

c++ - 如何在 C++ 中替换 vector 中的特定值?