swap — обмен значений двух объектов

Структуры и функции   12 Апрель 2012  Автор статьи:  

Процедура swap производит обмен значений двух объектов некоторого класса.

Библиотека

swap содержится в библиотеке algorithm. Чтобы подключить эту библиотеку, в текст программы необходимо добавить строку строку.

1
#include <algorithm>

Способы вызова
1
template <class T> void swap (T& a, T& b);

a,\; b — два объекта класса, в котором должен быть определен конструктор копирования и оператор присваивания.

В введенных обозначениях работу процедуры можно описать так, что объекту a присваивается значение объекта b, а объекту b — значение объекта a.

Пример реализации

Поведение процедуры swap в точности описывается следующим кодом.

1
2
3
4
5
6
7
template <class T> void swap (T& a, T& b)
{
    // Используем конструктор копирования
    T c(a);
    a = b;
    b = c;
}

Заметим, что в реализации используется конструктор копирования и два оператора присваивания, поэтому процедура работает за линейное от размера параметров время. Это не имеет значения в случае обмена значений двух объектов примитивного типа, однако может серьезно замедлить работу программы в случае использования swap для классов, содержащих большой объем данных. Во втором случае рекомендуется перегрузить метод swap так, чтобы операции в нем осуществлялись только над теми данными, которые подлежат обмену.

Сложность

O\; (sizeof\; (T))

Пример использования
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    // Введем две переменные и
    // зададим им некотороые значения
    int x = 5, y = 13;

    // После применения swap
    // переменная x станет равна 13,
    // а y станет равна 5
    swap (x, y);

    // Убедимся в этом
    cout << x << ' ' << y << endl;
   
    // Результат:
    // 13 5

    // swap можно использовать и
    // для более сложных объектов
    int a[] = { 1, 2, 3 };
    int b[] = { 11, 7, 5 };

    // Аналогично, после этой операции
    // массивы обменяются элементами
    swap (a, b);

    // Убедимся в корректности
    // такого применения swap
    for (int i = 0; i < 3; i++)
    {
        cout << a[i] << ' ' << b[i] << endl;
    }

    // Результат:
    // 11 1
    // 7 2
    // 5 3

    return 0;
}

Научиться программировать

  • на Delphi

  • на Java

  • на C++