Функция swap в C++ <array>

Класс контейнера 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 <iostream>
#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

Анализ кода:

  1. a.swap(b)Поменяйте местами содержимое a и b.
  2. После обмена a содержит значения, изначально находившиеся в b, а b содержит значения, изначально находившиеся в a.

Пример 2: Использование std::swap

Вы также можете использоватьstd::swapфункцию для обмена двух массивов.

Пример

#include <iostream>
#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 <iostream>
#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 <iostream>
#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

Анализ кода:

  • Поскольку размер массива фиксирован, элементы нельзя по-настоящему удалить, но можно обменять его с массивом, заполненным нулями, чтобы "очистить" содержимое.
  • Это может быть полезно в некоторых сценариях.

Класс контейнера C++ <array>

Другие расширения