std :: swap();在else语句中使用时不起作用

问题描述 投票:0回答:2

这里是一组条件,这些条件使用swap函数在向量中移动char,具体取决于某些变量:

 if (m == 's')
{
  if (currenti == 5)
  {
    swap(height[currenti][currentj], height[0][currentj]);
  }
  else if (height[currenti++][currentj] == 'T')
  {
    cout << "Game over!" << endl;
    gameLive = 0;
  }
  else
  {
    swap(height[currenti][currentj], height[currenti++][currentj]);
  }
}

出于某种原因,else部分中的swap即使被调用也不会交换两个向量部分。 (我在else部分插入了一个cout,以进行检查)。但是,如果我删除其他这样的条件:

if (m == 's')
{
  swap(height[currenti][currentj], height[currenti++][currentj]);
}

完全正常。

有人知道是什么原因导致它无法以“ else”格式使用吗?

c++ vector indexing swap
2个回答
0
投票

此行:

swap(height[currenti][currentj], height[currenti++][currentj]); // Don't do it!!

正在用自身交换值!表达式height[currenti++][current]currenticurrent值作为第一个索引,然后对其进行递增。

您应该在else块中使用这样的代码:

else
{
    swap(height[currenti][currentj], height[currenti+1][currentj]);
    ++currenti;
}

注意:在第二个参数中使用pre-increment运算符作为索引很诱人:

swap(height[currenti][currentj], height[++currenti][currentj]); // Don't do it!!

但是这是未定义的行为,因为未指定对std::swap的参数的求值顺序。两种(增量后或增量前)中的一个或另一个在some平台上工作的时间为some,但您永远不能依赖它。


0
投票
交换(height [currenti] [currentj],height [currenti ++] [currentj]);
© www.soinside.com 2019 - 2024. All rights reserved.