C++同时给多个变量赋值

3
我需要在一个C++程序中编写特定的代码段,以执行以下类型的任务。
b:=a+b;
a:=a-b;

where := 运算符表示所有表达式右侧的值先计算,然后将每个表达式左侧的变量与右侧计算出的值相等。

例如,在上面的代码中,如果a=5且b=3,则我需要a和b的最终值分别为8和2,而不是执行常规赋值时得到的8和-3。


2
如果你将ab分配给临时变量,并在计算ab的表达式中使用这些临时变量,那么这似乎非常容易。你是想在不使用临时变量的情况下完成它吗? - James Adkison
我正在尝试编写机器学习中的随机梯度下降算法,其中我们必须在每次迭代中同时更新theta(参数)值。 - RaviTej310
@JamesAdkison 但是如果我有一百个变量怎么办?这通常是梯度下降的情况。 - RaviTej310
@Sibi,你可以创建一百个临时变量。这样做没有任何问题。 - R Sahu
如果你正在处理大量的值,你应该使用适当的容器(例如std::vector),这个逻辑可以很容易地放入一个循环中(或者你可以以任何你喜欢的方式封装它)。 - James Adkison
2个回答

9
您可以使用 std::tie()std::make_tuple()
std::tie(a, b) = std::make_tuple(a-b, a+b);

tie 创建引用的元组,元组赋值等同于逐个元素赋值。因此这实际上与以下代码相同:

// create the right-hand-side-tuple
auto __tmp1 = a-b;
auto __tmp2 = a+b;
// assign to the left-hand-side references
a = __tmp1;
b = __tmp2;

但因为这里的任务在概念上是“原子”的,你可以把它全部写在一行中——因为所有操作(包括a-ba+b)都在赋值本身之前进行了排序。

我需要在主函数外面写这个吗?另外,如果我的方程比简单的a+b和a-b更复杂怎么办? - RaviTej310
@Sibi 我不明白那个问题的意思 - 写在哪里之外?为什么表达式的复杂度很重要? - Barry
1
很好。这甚至从未在我脑海中出现过。 - NathanOliver
好的。有人能解释一下这实际上是做什么的吗? - RaviTej310
2
@Sibi 它使用表达式 a-ba+b 来创建一个 std::tuple(即一种创造我所说的临时变量的创造性方式),然后从 tuple 中取出值并将它们保存回 ab - James Adkison
@JamesAdkison 谢谢! - RaviTej310

0
你可以使用类似于“before”和“after”的名称结构来保存你的变量。然后,无论你有多少个变量,你都可以使用以下代码:
after.a = before.a + before.b;
after.b = before.a - before.b;

然后,一旦您的计算完成,您可以通过以下语句移动所有新值:

before = after;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接