Функция swap
Функция swap выполняет обмен значениями между двумя объектами.
В первом параметре мы передаем первый объект, а во второй - второй объект.
После вызова функции значения объектов меняются местами. Функция
объявлена в заголовочном файле <utility> и доступна в пространстве
имен std. Начиная со стандарта C++11, функция swap также
поддерживает перемещение (move-семантику), что делает её особенно
эффективной для обмена тяжелыми объектами, такими как контейнеры.
Стандартная библиотека предоставляет специализации swap для
всех стандартных контейнеров (vector, string, map и других), а также
для базовых типов. Для пользовательских типов можно перегрузить
функцию swap, чтобы обеспечить эффективный обмен.
Синтаксис
#include <utility>
// Общий шаблон
template <class T>
void swap(T& a, T& b) noexcept(/* см. ниже */);
// Специализация для массивов
template <class T, size_t N>
void swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b)));
Пример
Давайте обменяем значения двух целочисленных переменных:
#include <iostream>
#include <utility>
using namespace std;
int main()
{
int a = 1;
int b = 2;
cout << "Before swap: a = " << a << ", b = " << b << endl;
swap(a, b);
cout << "After swap: a = " << a << ", b = " << b << endl;
return 0;
}
Результат выполнения кода:
"Before swap: a = 1, b = 2"
"After swap: a = 2, b = 1"
Пример
Давайте обменяем содержимое двух строк:
#include <iostream>
#include <string>
#include <utility>
using namespace std;
int main()
{
string str1 = "abcde";
string str2 = "12345";
cout << "Before swap: str1 = " << str1 << ", str2 = " << str2 << endl;
swap(str1, str2);
cout << "After swap: str1 = " << str1 << ", str2 = " << str2 << endl;
return 0;
}
Результат выполнения кода:
"Before swap: str1 = abcde, str2 = 12345"
"After swap: str1 = 12345, str2 = abcde"
Пример
Давайте обменяем содержимое двух векторов:
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
int main()
{
vector<int> vec1 = {1, 2, 3, 4, 5};
vector<int> vec2 = {10, 20, 30};
cout << "Before swap: vec1 size = " << vec1.size()
<< ", vec2 size = " << vec2.size() << endl;
swap(vec1, vec2);
cout << "After swap: vec1 size = " << vec1.size()
<< ", vec2 size = " << vec2.size() << endl;
cout << "vec1 contains:";
for (int x : vec1)
cout << " " << x;
cout << endl;
cout << "vec2 contains:";
for (int x : vec2)
cout << " " << x;
cout << endl;
return 0;
}
Результат выполнения кода:
"Before swap: vec1 size = 5, vec2 size = 3"
"After swap: vec1 size = 3, vec2 size = 5"
"vec1 contains: 10 20 30"
"vec2 contains: 1 2 3 4 5"