在python中,我必须交换2个变量的值,所有你需要做的就是
x,y=y,x
Run Code Online (Sandbox Code Playgroud)
可以看一下它就好像两个语句 - (x = y)和(y = x)并行执行而不是一个接一个地执行.
有没有办法在c ++中实现相同的效果?
注意/编辑:
我希望将这种"并行效果"(如果存在)扩展到更复杂的表达式,如
ones,twos= (ones ^ n) ^ ~twos, (ones & n) | (twos & ~n);
这在python中是可能的,是否可以在c ++中使用?
结论:
所以根据leemes给出的答案和对他答案的评论:
1.您可以在C++ 03或中使用boost库
你可以使用C++ 11
访问std::tie并std::tuple实现这种"并行"效果.至于目前,我将leemes的答案标记为已被接受,但我仍然在寻找在C++ 03中实现这一很酷功能的方法.
lee*_*mes 18
特例:交换两个变量的值
(有关一般解决方案,请参阅下文.)
要在C++中交换两个变量的值,您应该始终使用swap:
using std::swap;
swap(x, y); // Do NOT say: std::swap(x, y) -- Read about Koenig lookup!
Run Code Online (Sandbox Code Playgroud)
不要麻烦怎么会做到这一点; 它会很快完成.如果处理器支持,C++标准库的实现将尽力将其优化为单个指令(但标准并没有告诉实现这样做).对于仅寄存器变量,例如x86指令xchg将尽可能快地执行.不要尝试用一些"三个xor操作"来调整它,它不会更快.如果你运气不好,它将不会被优化为类似的东西xchg.
swapC++ 03中的泛型操作引入了一个临时变量并执行三个复制结构.在C++ 11中,存在移动语义,并且移动对象而不是复制.对于您自己的类型,假设某些数据结构仅包含指向实际数据的指针,您应该优化此过程以使其在恒定时间内执行:
在C++ 03中,您可以在命名空间中专门化std::swap或实现自己的swap函数(请参阅此问题的两个主要答案)以优化交换:只需交换类中的每个成员来交换数据.对于只保存指针的数据结构示例,只需交换指针即可.
在C++ 11中,有一些新的移动语义,它允许您实现数据从一个对象移动到另一个对象,这将导致非常相似的行为.(移动语义已被引入更普遍的问题,如交换两个对象:如果不再需要一个对象,但另一个必须是第一个的"副本",它可以简单地移动.)阅读关于移动语义和移动构造函数以获取详细信
对于C++ 03和C++ 11,还有另一种方法:您可以为数据结构等重类实现隐式共享数据和copy-on-write.在上面的示例中,您的数据结构包含指向实际数据的指针,请实现引用计数.复制数据结构时,只需将参考计数器增加1即可.修改数据时,请确保它不共享(ref count = 1),否则通过仅复制它来"分离"它.这导致了恒定时间的复制和交换操作.
一般情况:多个任意表达式
对于其他不依赖于输入/输出的语句,例如(a, b) = (x, y),只需按"原样"编写它们,它至少会完全流水线化,因为它们没有任何依赖:
a = x;
b = y;
Run Code Online (Sandbox Code Playgroud)
如果他们是输入/输出依赖性,就像在你的编辑例如,你可以把它分解并引进临时工.你不会试图通过xoring等一些花哨的表达技巧来解决这个问题.编译器知道很多汇编程序的技巧(比如xchg),你只知道用简单的C++(比如xor)来表达这些技巧.
在C++ 11,有std::tuple和std::tie允许你指定多个表达式,而不引入临时对象(它们将场景以保持存储在该元组中的值的后面被引入,并试图优化它们要么完全离开或至少仅使用寄存器来保存如果可能的话):
using std::tie;
using std::make_tuple;
tie(ones, twos) = make_tuple((ones ^ n) ^ ~twos, (ones & n) | (twos & ~n));
Run Code Online (Sandbox Code Playgroud)
请注意,右侧对/元组的类型必须与左侧的目标值匹配,因为此处并不隐含转换.如果遇到问题,请static_cast在右侧执行,告诉std::make_tuple显式类型或仅使用构造函数来std::tuple要求显式类型,例如:
using std::tie;
using std::tuple;
tie(ones, twos) = tuple<int,int>((ones ^ n) ^ ~twos, (ones & n) | (twos & ~n));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |