Функция swap в C++ <array>
swapиспользуется в array дляОбмен содержимым двух массивов.Эта функция — очень полезный инструмент.
swapявляется функцией-членом класса контейнера, используемой дляобмена содержимым двух массивов.Оба массива должны быть одного типа и одного размера.
swapОн предоставляет эффективный способ обмена содержимым двух контейнеров и является распространённым инструментом в реализациях алгоритмов и структур данных.
Определения слов: swapЭто означает «swap», то есть обмен содержимым двух массивов.
Базовый синтаксис и параметры
swapЭто функция-член класса контейнера, и она требует другой массив в качестве параметра.
Формат синтаксиса
void swap(array& other) noexcept;
Описание параметра
- Параметр:
other- Тип:
array<T, N>&(ссылки того же типа) - Описание: Другой массив, с содержимым которого выполняется обмен. Оба массива должны иметь одинаковый тип элементов и размер.
- Тип:
Описание функции
- Возвращаемое значение:
void(Нет возвращаемого значения). - ДействиеМеняет местами все элементы двух массивов. Это операция O(n) и требует поэлементного обмена.
- Примечание:
swapОбычно объявляется какnoexcept, указывая, что исключение не будет выброшено.
Пример
Давайте тщательно освоим это на серии примеров.swapИспользование.
Пример 1: Базовое использование - обмен двух массивов
Пример
#include <array>
int main() {
std::array<int, 5> a = {1, 2, 3, 4, 5};
std::array<int, 5> b = {10, 20, 30, 40, 50};
std::cout << "Before swap:" << std::endl;
std::cout << "a: ";
for(int n : a) std::cout << n << " ";
std::cout << std::endl;
std::cout << "b: ";
for(int n : b) std::cout << n << " ";
std::cout << std::endl;
// Обмен двух массивов
a.swap(b);
std::cout << "\n"After swap:" << std::endl;
std::cout << "a: ";
for(int n : a) std::cout << n << " ";
std::cout << std::endl;
std::cout << "b: ";
for(int n : b) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
Ожидаемый вывод:
交换前: a: 1 2 3 4 5 b: 10 20 30 40 50 交换后: a: 10 20 30 40 50 b: 1 2 3 4 5
Анализ кода:
a.swap(b)Поменяйте местами содержимое a и b.- После обмена a содержит значения, изначально находившиеся в b, а b содержит значения, изначально находившиеся в a.
Пример 2: Использование std::swap
Вы также можете использоватьstd::swapфункцию для обмена двух массивов.
Пример
#include <array>
#include <algorithm>
int main() {
std::array<int, 3> arr1 = {1, 2, 3};
std::array<int, 3> arr2 = {4, 5, 6};
std::cout << "Перед обменом: " << std::endl;
std::cout << "arr1: ";
for(int n : arr1) std::cout << n << " ";
std::cout << std::endl;
// Используйте std::swap
std::swap(arr1, arr2);
std::cout << "После обмена: " << std::endl;
std::cout << "arr1: ";
for(int n : arr1) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
Ожидаемый вывод:
交换前: arr1: 1 2 3 交换后: arr1: 4 5 6
Анализ кода:
std::swap(arr1, arr2)Вы также можете поменять местами два массива таким же образом.- Результат тот же, что и при вызове функции-члена
swapТо же самое.
Пример 3: Обращение массива
Вы можете использовать swap для обращения массива.
Пример
#include <array>
#include <algorithm>
int main() {
std::array<int, 5> numbers = {1, 2, 3, 4, 5};
std::cout << "Перед обращением: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
// Используйте два указателя для обращения с помощью обмена
auto left = numbers.begin();
auto right = numbers.end() - 1;
while(left < right) {
std::swap(*left, *right);
++left;
--right;
}
std::cout << "После обращения: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
Ожидаемый вывод:
反转前: 1 2 3 4 5 反转后: 5 4 3 2 1
Анализ кода:
- Использование указателей head и tail и
std::swapЭто позволяет добиться разворота массива. - Это алгоритм разворота, реализованный вручную.
Пример 4: Очистка массива
Можно выполнить обмен с пустым массивом, чтобы получить эффект очистки (хотя размер массива фиксирован, содержимое можно обменять).
Пример
#include <array>
int main() {
std::array<int, 5> data = {1, 2, 3, 4, 5};
std::array<int, 5> empty = {};
std::cout << "До обмена - data: ";
for(int n : data) std::cout << n << " ";
std::cout << std::endl;
// Обмен с пустым массивом
data.swap(empty);
std::cout << "После обмена - data: ";
for(int n : data) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
Ожидаемый вывод:
交换前 - data: 1 2 3 4 5 交换后 - data: 0 0 0 0 0
Анализ кода:
- Поскольку размер массива фиксирован, элементы нельзя по-настоящему удалить, но можно обменять его с массивом, заполненным нулями, чтобы "очистить" содержимое.
- Это может быть полезно в некоторых сценариях.
Другие расширения