@Programer2012

Шаблонные функции. Какие преимущества?

Доброго времени суток!
Посоветуйте пожалуйста какую из двух функций лучше использовать?
в стиле Си:
double GetAverage(double arr[], int numElems) {
        double total = 0.0;
        for(int h = 0; h < numElems; ++h)
            total += arr[h] / numElems;
        return total;
    }

или шаблон:
template <typename ForwardIterator>
    double GetAverage(ForwardIterator begin, ForwardIterator end) {
        return std::accumulate(begin, end, 0.0) / std::distance(begin, end);
    }

В примере из руководства по с++ написано, что предпочтительно использовать шаблон, но меня смущает вызов 2 дополнительных функций в шаблоне.
Заранее спасибо.
  • Вопрос задан
  • 283 просмотра
Решения вопроса 1
но меня смущает вызов 2 дополнительных функций в шаблоне
  1. Функции заинлайнятся, за производительность тут переживать не стоит.
  2. У вас немного разные алгоритмы. В шаблоне никто не запрещает вам пройтись циклом по итераторам и посчитать среднее тем же способом, что и в первом варианте.
  3. Использование stl-функций предпочтительнее своего велосипеда. Читать код легче. Я увидел accumulate и сразу подумал о свёртке. А в первый пример пришлось вчитываться. К тому же он ещё и не оптимальный - ведь деление можно вынести из цикла.
  4. Данный вариант с шаблоном намного гибче - его можно использовать с любым контейнером, который реализует итератор.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
petermzg
@petermzg
Самый лучший программист
Если код функции должен работать с разными типами входных параметров, то имеет смысл использовать шаблоны.
Если только с одним типом, то нет.
Ответ написан
Комментировать
maaGames
@maaGames
Погроммирую программы
Реализации функций не эквивалентны и будут возвращать разный результат, практически со 100% вероятностью.
В первом случае суммируется частное от значения и количества элементов, а во втором элементы сперва суммируются, а потом делятся на число элементов. В первом случае больше накопление погрешностей вычислений, больше операций деления, следовательно, меньшая точность вычислений и меньшая скорость работы.
Если в первом варианте деление вынести из цикла, то различие будет только в гибкости кода.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы