2016-02-19 4 views
2

Мне нужно написать определенный сегмент кода в программе C++, которая выполняет задачу следующего типа.C++ одновременное присвоение значений переменным

b:=a+b; 
a:=a-b; 

где: оператор = означает, что значение на правой стороне всех выражений вычисляется первым, а затем переменные на левой сторону каждого выражения приравниваются к вычисленным значениям справа.

Например, в приведенном выше коде, если a = 5 и b = 3, мне понадобится конечное значение a и b для 8 и 2 соответственно вместо 8 и -3, которые я получу, если я выполню нормальное назначение.

+2

Этот кажется довольно простым, если вы назначаете 'a' и' b' временным и используете временные выражения в выражениях, вычисляющих 'a' и' b'. Вы пытаетесь сделать это без использования временных рядов? –

+0

Я пытался кодировать стохастический алгоритм спуска градиента в машинное обучение, в котором мы должны одновременно обновлять значения theta (parameter) на каждой итерации. – RaviTej310

+0

@JamesAdkison Но что, если бы у меня было сто переменных? Обычно это происходит при градиентном спуске. – RaviTej310

ответ

7

Вы можете использовать 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-b и a+b) упорядочиваются перед тем само присваивание.

+0

Должен ли я написать это за пределами основной функции? Кроме того, вместо простых a + b и a-b, что, если бы у меня были более сложные уравнения? – RaviTej310

+0

@ Сиби Я не понимаю, что этот вопрос означает - напишите, что вне того где? Почему сложность выражения имеет значение? – Barry

+1

Ницца. Это мне даже и не приходило в голову. – NathanOliver

0

Вы можете использовать структуры с именами, такими как before и after, чтобы держать ваши переменные. Затем, независимо от того, сколько переменных у вас есть, вы можете использовать код следующим образом:

after.a = before.a + before.b; 
after.b = before.a - before.b; 

, а затем, как только ваши расчеты сделаны, вы можете переместить все новые значения в инструкции:

before = after;