Способы поменять значения переменных местами. С++

На Python есть следующий способ:

a = 5
b = 1
a, b = b, a

Попробовал тоже самое на плюсах, не получилось, только так:

int a = 5; int b = 10; int c = 0;
c = a; a = b; b = c;

Есть ли метод сделать быстрее?


Ответы (2 шт):

Автор решения: Sergey Tatarincev

На счет быстрее не уверен, но компактнее можно. std::swap по итогу реализована ровно так же

int a = 57;
int b = 45;
printf("%d %d\n",a,b);
std::swap(a,b);
printf("%d %d\n",a,b);

И в качестве дополнительного метода - обмен без использования временной переменной из школьного курса

a=a+b;
b=a-b;
a=a-b;
→ Ссылка
Автор решения: Harry

О скорости в Python и плюсах.

a = 5
b = 1
for i in range(0,100000000):
    a, b = b, a
print(a,b)

Этот код на моей машине выполняется примерно 10 секунд. На VC++2019 при компиляции аналога

int a = 5, b = 1;
for(int i = 0; i < 100000000; ++i)
{
    int c = a;
    a = b;
    b = c;
}
cout << a << " " << b;

я отключил оптимизацию (иначе результат очевиден :)), так что код скомпилировался в

; 20   :     int a = 5, b = 1;

    mov DWORD PTR a$[rsp], 5
    mov DWORD PTR b$[rsp], 1

; 21   :     for(int i = 0; i < 100000000; ++i)

    mov DWORD PTR i$1[rsp], 0
    jmp SHORT $LN4@main
$LN2@main:
    mov eax, DWORD PTR i$1[rsp]
    inc eax
    mov DWORD PTR i$1[rsp], eax
$LN4@main:
    cmp DWORD PTR i$1[rsp], 100000000       ; 05f5e100H
    jge SHORT $LN3@main

; 22   :     {
; 23   :         int c = a;

    mov eax, DWORD PTR a$[rsp]
    mov DWORD PTR c$2[rsp], eax

; 24   :         a = b;

    mov eax, DWORD PTR b$[rsp]
    mov DWORD PTR a$[rsp], eax

; 25   :         b = c;

    mov eax, DWORD PTR c$2[rsp]
    mov DWORD PTR b$[rsp], eax

; 26   :     }

    jmp SHORT $LN2@main
$LN3@main:

; 27   :     cout << a << " " << b;

со временем выполнения порядка 0.25 секунд.

Не всегда то, что записано кратко, быстро.

При том же ключике /Od применение swap

; 23   :         swap(a,b);

    lea rdx, QWORD PTR b$[rsp]
    lea rcx, QWORD PTR a$[rsp]
    call    ??$swap@H$0A@@std@@YAXAEAH0@Z       ; std::swap<int,0>

увеличило время работы примерно вдвое.

→ Ссылка