Easyалгоритмы

Чем std::transform отличается от std::for_each?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

std::for_each — вызывает f(element) для side effects (печать, accumulate). std::transform — применяет f и записывает результат в выходной итератор (как map в функциональных языках).

std::vector<int> v{1, 2, 3};

// for_each — side effects
std::for_each(v.begin(), v.end(), [](int x) { std::cout << x; });

// transform — создаёт новую последовательность
std::vector<int> out(v.size());
std::transform(v.begin(), v.end(), out.begin(),
               [](int x) { return x * 2; });   // out = {2, 4, 6}
// С C++20 views::transform даёт lazy (без аллокации) transform
  • for_each — для side effects, transform — для создания новой последовательности;
  • transform возвращает end выходного итератора.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.