在python中,我必须交换两个变量的值,你只需要做的就是
x,y=y,x
我们可以把它看作是两个语句-(x=y)和(y=x)是并行执行的,而不是一个接一个地执行。在
在c++中有什么方法可以达到同样的效果吗?在
注释/编辑:
我希望将这种“平行效应”(如果存在的话)扩展到更复杂的表达式中,比如ones,twos= (ones ^ n) ^ ~twos, (ones & n) | (twos & ~n);
这在python中是可能的,在c++中可能吗?在
结论:
所以根据leemes给出的答案和对他的回答的评论:
< p > 1。可以在C++ 03或中使用Boost库。 < P > 2。可以使用C++ 11访问std::tie
和{
如果}是普通整数,那么有多种快速技巧可以在一行中交换它们:
x
和{http://cpptruths.blogspot.com/2006/04/swapping-two-integers-in-one-liner.html
特殊情况:交换两个变量的值
(一般解决方案见下文)
在C++中交换两个变量的值,你应该总是使用^{} :< /p>
不用担心它是如何做到的;它会很快做到的。如果处理器支持它,则C++标准库的实现将尽其所能将其优化为<>强单指令<强>(但标准不告诉实现这样做)。对于仅寄存器变量,例如x86指令^{} ,它将尽可能快地执行此操作。不要试图用一些“三异或操作”来调整它,它不会更快。如果不走运,它将不会被优化为
xchg
。在C++ 03中的通用^ {< CD1>}操作引入临时变量并执行三个副本结构。在C++ 11中有移动语义,对象比复制的对象移动得多。对于您的自己的类型,假设某些数据结构只保存一个指向实际数据的指针,您应该优化此过程,使其在恒定时间内执行:
< > >强> > C++ 03 <强>中,你可以在{ {3} } }中专门化或在命名空间(see the two top answers on this question)中实现自己的^ {{CD1>}函数以优化交换:只需交换类中的每个成员来交换它们的数据。对于只保存指针的数据结构示例,只需交换指针即可。< > >强> >在C++ 11 中,有了新的移动语义,它允许你实现数据从一个对象到另一个对象的移动,这将导致一个非常相似的行为。(移动语义是针对诸如交换两个对象这样的更一般的问题引入的:如果不再需要一个对象,但另一个对象必须是第一个对象的“副本”,则可以简单地移动它。)有关移动语义和移动构造函数的详细信息,请阅读。<> L>>C++ 03和C++ 11 < /强>有一种替代方法:可以实现隐式共享数据和重写类EME>重数据结构类。在上面的示例中,如果数据结构包含指向实际数据的指针,则实现引用计数。复制数据结构时,只需将引用计数器增加一。修改数据时,请确保它不是共享的(ref count=1),否则只通过复制来“分离”它。这将导致恒定时间的复制和交换操作。
一般情况:多个任意表达式
对于其他不依赖于输入/输出的语句,如
^{pr2}$(a, b) = (x, y)
,只需“原样”编写它们,并且它至少可以完美地流水线运行,因为它们没有任何依赖关系:如果你可以把输入分成两部分。你不会帮自己一个忙,试图用一些花哨的表达技巧,如异或。编译器知道汇编程序的许多技巧(如^ {CD2}}),你只知道在普通C++中表达这种技巧(如XOR)。在
<>在C++ 11中,有{{CD9>}和^{请注意,右侧对/元组的类型必须与左侧的目标值匹配,因为这里的转换不是隐式的。如果遇到问题,请在右侧执行
static_cast
,告诉std::make_tuple
显式类型,或者只对需要显式类型的std::tuple
使用构造函数,例如:相关问题 更多 >
编程相关推荐