Способы поменять значения переменных местами. С++
На 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 шт):
На счет быстрее не уверен, но компактнее можно. 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;
О скорости в 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>
увеличило время работы примерно вдвое.