Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在'中运行语句;平行';_C++_Python - Fatal编程技术网

C++ 在'中运行语句;平行';

C++ 在'中运行语句;平行';,c++,python,C++,Python,在python中,我必须交换两个变量的值,您所需要做的就是 x,y=y,x 我们可以将其视为两条语句(x=y)和(y=x)并行执行,而不是一条接一条地执行 在C++中,有什么方法可以达到同样的效果? 注释/编辑: 我希望将这种“平行效应”(如果存在)扩展到更复杂的表达式,如 one,twos=(one^n)^~twos,(one&n)|(twos&n) 这可能在Python中,C++中有可能吗? 结论: 因此,根据Leems给出的答案和对其答案的评论: 1.您可以在C++03或中使用boost

在python中,我必须交换两个变量的值,您所需要做的就是

x,y=y,x
我们可以将其视为两条语句(x=y)和(y=x)并行执行,而不是一条接一条地执行

在C++中,有什么方法可以达到同样的效果?

注释/编辑:

我希望将这种“平行效应”(如果存在)扩展到更复杂的表达式,如
one,twos=(one^n)^~twos,(one&n)|(twos&n)

这可能在Python中,C++中有可能吗? 结论:

因此,根据Leems给出的答案和对其答案的评论:

1.您可以在C++03或中使用boost库

2.您可以使用C++11

访问
std::tie
std::tuple
以实现这种“并行”效果。
就目前而言,我认为leemes的答案是可以接受的,但我仍在寻找在C++03中实现这一酷功能的方法。

特例:交换两个变量的值

(有关一般解决方案,请参见下文。)

在C++中交换两个变量的值,你应该总是使用:

不要担心它会怎么做;它会做得很快。如果处理器支持它,则C++标准库的实现将尽其所能将其优化为<>强单指令<强>(但标准不告诉实现这样做)。对于仅寄存器变量,例如x86指令将尽可能快地完成此操作。不要试图用“三个异或运算”来调整它,它不会更快。如果您运气不好,它将不会被优化为类似
xchg

C++03中的泛型
swap
操作引入一个临时变量并执行三个复制构造。在C++11中有移动语义,对象是移动的而不是复制的。对于您自己的类型,假设某些数据结构只包含指向实际数据的指针,您应该优化此过程,使其在恒定时间内执行:

  • 在C++03中,您可以专门化
    std::swap
    或在命名空间中实现自己的
    swap
    函数来优化交换:只需交换类中的每个成员以交换其数据即可。对于只包含指针的数据结构示例,只需交换指针

  • 在C++11中,有新的移动语义,允许您实现数据从一个对象移动到另一个对象,这将导致非常相似的行为。(移动语义是为更一般的问题引入的,比如交换两个对象:如果一个对象不再需要,但另一个对象必须是第一个对象的“副本”,那么它可以简单地移动。)有关移动语义和移动构造函数的详细信息,请阅读

  • 对于C++03和C++11,有一种替代方法:可以实现隐式共享数据,并对数据结构等重类进行写时复制。在上面的示例中,如果数据结构包含指向实际数据的指针,则实现引用计数。复制数据结构时,只需将引用计数器增加1。修改数据时,请确保它不是共享的(ref count=1),否则仅在此时通过复制将其“分离”。这将导致恒定时间的复制和交换操作


一般情况:多个任意表达式

对于其他不依赖于输入/输出的语句,如
(a,b)=(x,y)
,只需按“原样”编写它们,它将至少以完美的管道方式运行,因为它们没有任何依赖性:

a = x;
b = y;
如果它们依赖于输入/输出,如编辑中的示例,则可以将其拆分并引入临时变量。如果试图用一些奇特的表达式技巧(如xor ing)来解决这样的问题,你不会帮自己一个忙。编译器知道汇编程序的许多技巧(比如<代码> xCHG),你只知道用普通C++(如XOR)来表达这种技巧。 在C++11中,有一个
std::tuple
,允许您分配多个表达式,而不引入临时变量(它们将在后台引入以保存存储在tuple中的值,并尝试完全优化它们,或者至少在可能的情况下仅使用寄存器保存它们):

请注意,右侧对/元组的类型必须与左侧的目标值匹配,因为转换在这里不是隐式的。如果遇到问题,请在右侧执行
static\u cast
,告诉
std::make\u tuple
显式类型,或者只使用需要显式类型的
std::tuple
的构造函数,例如:

using std::tie;
using std::tuple;
tie(ones, twos) = tuple<int,int>((ones ^ n) ^ ~twos, (ones & n) | (twos & ~n));
使用std::tie;
使用std::tuple;
tie(one,twos)=元组((one^n)^~twos,(one&n)|(twos&n));

如果
x
y
是纯整数,有多种快速技巧可以在一行中交换它们:


std::swap(x,y)是首选方式。@克里斯:事实上,
std::swap(x,y)
是错误的方式。@Mehrdad,说得好。我的重点是使用预制版本,而不是总是尝试内联它,但这是一个有效的问题。大多数问题都会导致未定义的行为,即使没有,也不会比三行示例快。技巧对于教育目的、代码测试等都很好,但是对于真正的代码,使用类似于
std::swap
的东西。有人知道
std::tie
在C++11之前是否存在吗?我不确定。我想是的,但谷歌对此并不健谈。它只在boost中可用吗?不——C++03没有std::tie或元组(尽管boost在C++03中实现了它们)。@JerryCoffin感谢您的指出;所以,正如所料,C++11只有一个很好的解决方案,除非你想在C++03中使用boost。@Mehrdad(编辑):哦,谢谢你的poi
using std::tie;
using std::make_tuple;
tie(ones, twos) = make_tuple((ones ^ n) ^ ~twos, (ones & n) | (twos & ~n));
using std::tie;
using std::tuple;
tie(ones, twos) = tuple<int,int>((ones ^ n) ^ ~twos, (ones & n) | (twos & ~n));