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 подскажет развёрнутый ответ в реальном времени.