Как своп реализован в с ++ - PullRequest
       9

Как своп реализован в с ++

4 голосов
/ 10 октября 2010

Я только начинаю изучать метапрограммирование, мне интересно внедрение swap.Кто-нибудь может мне помочь и объяснить идею черт в метапрограммировании?спасибо.

Ответы [ 2 ]

10 голосов
/ 10 октября 2010

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 для своего компилятора и ОС.

3 голосов
/ 10 октября 2010

С http://www.cplusplus.com/reference/algorithm/swap/:

Поведение этого шаблона функции эквивалентно:

template <class T> void swap ( T& a, T& b )
{
  T c(a); a=b; b=c;
}
...