Mediumалгоритмы
Чем std::accumulate полезен и какие правила?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
std::accumulate(first, last, init, op) — сворачивает диапазон через бинарную операцию. По умолчанию op = std::plus (сложение). Тип init определяет тип результата.
std::vector<double> v{1.5, 2.5, 3.0};
std::accumulate(v.begin(), v.end(), 0.0); // 7.0 — double init → double
// ОШИБКА: accumulate(..., 0) даст int — lossy, даже если элементы double!
std::accumulate(v.begin(), v.end(), 1.0, std::multiplies<>()); // произведениеaccumulate(..., 0)с int init → lossy для double элементов; используйте0.0;- Для строк:
accumulate(..., std::string(""))— конкатенация; - С C++17
std::reduce— parallel версия (требует commutativity); - C++20
std::ranges::fold_left— современная замена accumulate.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.