2010-07-10 4 views

ответ

23

Использование std::swap

std::swap(var1, var2); 
+3

Я согласен с использованием std :: swap С оговоркой, что std :: swap использует конструкторы копирования того, что вы меняете. Поэтому имейте в виду, что это нормально для примитивных типов данных, но как только вы начинаете входить в более крупные структуры и классы, он становится менее эффективным. http://www.cplusplus.com/reference/algorithm/swap/ –

+3

@C Nielsen, но вы можете использовать обычную идиому и специализироваться на 'std :: swap' для дорогих классов, чтобы избежать временного. –

+0

Такие большие объекты могут перегружать 'std :: swap', если есть более эффективный метод. –

5

Как говорит Стивен, использовать std::swap(var1, var2);

Это шаблонная функция, так что вы можете предоставить свои собственные специализации для конкретных классов, таких как смарт-указатели, которые могут иметь дорогие операторы присваивания:

namespace std 
{ 
    template<> 
    void swap<MySmartPointer>(MySmartPointer& v1, MySmartPointer& v2) 
    { 
     std::swap(v1.internalPointer, v2.internalPointer); 
    } 
} 

// ... 

std::swap(pointerA, pointerB); // super-fast!!!!1 
+3

Обязательно прочитайте обсуждения в [Как перегружать 'std :: swap'] (http: // stackoverflow. com/questions/11562/how-to-overload-stdswap). Это хороший подход, но вы должны знать о связанных с ним проблемах. –

1

Существует также Boost Swap.

http://www.boost.org/doc/libs/1_43_0/libs/utility/swap.html

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

Смежные вопросы