Mediumswap
Как реализовать swap для своего класса?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Стандартный паттерн — свободная функция swap через ADL (обычно friend внутри класса), noexcept, использующая using std::swap для членов.
class MyClass {
std::vector<int> data_;
std::string name_;
public:
friend void swap(MyClass& a, MyClass& b) noexcept {
using std::swap; // включает ADL для членов
swap(a.data_, b.data_); // вызывает vector::swap если есть
swap(a.name_, b.name_);
}
};Ключевые моменты:
using std::swap;в начале включает ADL — если у типов членов есть оптимизированная swap, будет вызвана она, иначеstd::swap(тройной move);noexcept, потому что swap должна быть дешёвой и небросающей;- copy-and-swap и STL-алгоритмы ищут swap через ADL.
Для классов с heap-данными swap за O(1) — просто обмен указателей.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.