std::swap
из <algorithm>
реализован в виде шаблона, так что он может обмениваться значениями двух переменных любого заданного типа.Его прототип выглядит так:
template <typename T> void swap(T& a, T& b);
Типичная реализация состоит в том, чтобы сохранить одно значение во временном файле, скопировать второе значение в первую переменную, а затем поместить временное значение во вторую переменную.В C ++ это включает в себя конструктор копирования и операторы присваивания.
Для больших объектов вся эта конструкция и копирование могут быть дорогими.Так много объектов, включая большинство (все?) Из контейнеров STL, имеют перегруженную реализацию, которая работает путем обмена несколькими значениями указателя.Обмен указателями происходит очень быстро и позволяет избежать возможных сбоев (например, выделения памяти во время конструктора копирования).Перегруженный std::swap
пересылает функцию-член (часто также называемую swap
).Функция-член имеет доступ к внутренним компонентам, поэтому она может использовать более эффективный подход.Перегрузка может выглядеть примерно так (упрощенно):
template <typename T> void swap<vector<T> >(vector<T>& a, vector<T>& b) {
a.swap(b);
}
Если вы хотите увидеть реальный код, вы можете просмотреть заголовочные файлы std
для своего компилятора и ОС.