Выбор ответа Middle Алгоритмы STL и ranges обновлено

Тип результата accumulate

Вопрос

Что вернёт std::accumulate(v.begin(), v.end(), 0) для std::vector<double> v{0.5, 0.5, 1.5}?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: 1: аккумулятор int, дробь отбрасывается на каждом шаге. Тип аккумулятора берётся из начального значения: int.

Варианты ответа

  1. 2.5: сумма считается в double по типу элементов
  2. 2: сумма 2.5 округляется до int только в конце
  3. 1: аккумулятор int, дробь отбрасывается на каждом шагеправильный ответ
  4. Ошибка компиляции: int и double не складываются здесь

Разбор

Тип аккумулятора берётся из начального значения: int. Шаги: 0 + 0.5 = 0.5 превращается в 0, затем снова 0, затем 0 + 1.5 = 1.5 превращается в 1. Правильно писать 0.0.

  • 2.5 получится при начальном значении 0.0.
  • 2 получилось бы при округлении только итоговой суммы.
  • Компилируется, в лучшем случае с предупреждением о сужении.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.