На этом шаге мы рассмотрим вспомогательную функцию, используемую для обмена двух значений.
Функция swap() меняет местами значения двух объектов. Общая реализация swap() определяется в заголовочном файле <algorithm> следующим образом:
namespace std { tempiate<class T> inline void swap(T& a, T& b) { T tmp(a); a = b: b = tmp; } }
Таким образом, чтобы поменять значения двух произвольных переменных х и у, можно воспользоваться вызовом
std::swap(x,y);
Разумеется, этот вызов работает только в том случае, если в функции swap() возможно конструирование копий и присваивание.
Большим преимуществом swap() является то, что программист может определить специальную реализацию для более сложных типов посредством специализации шаблона или перегрузки функции. Специальные реализации экономят время, используя внутреннюю перестановку членов классов вместо присваивания объектов. В частности, такая возможность реализована во всех стандартных контейнерах и строках. Например, реализация swap() для простого контейнера, содержащего только массив и количество элементов, выглядит примерно так:
class MyContainer { private: int* elems; // Динамический массив элементов int numElems; // Количество элементов publiс: // Реализация swap() void swap(MyContainer& x) { std::swap(elems,x.elems); std::Swap(numElems,x.numElems); } . . . . }; // Перегрузка глобальной версии swap() для данного типа inline void swap (MyContainer& c1, MyContainer& c2) { c1.swap(c2); // Вызов специальной реализации swap() }
Таким образом, вызов swap() вместо прямой перестановки значений заметно повышает эффективность операции. Всегда определяйте специализированную версию swap() для своих типов, если это поможет повысить быстродействие программы.
На следующем шаге мы рассмотрим вспомогательные операторы сравнения.