Можно ли заменить std :: transform на std :: аккумулировать? - PullRequest
5 голосов
/ 23 сентября 2019

У меня есть общий вопрос.Можем ли мы всегда заменить std::transform на std::accumulate?Я видел эту замену во многих случаях / примерах.Так возможно ли это в теории, и если это так, то почему было введено std::transform?

Ответы [ 2 ]

8 голосов
/ 23 сентября 2019

Эти два алгоритма имеют совершенно разные цели.

std::accumulate в мире функционального программирования известен как fold , и его целью является итерация по элементам последовательности и применение двух аргументовоперация складывания этих элементов, один аргумент которой является результатом предыдущего сгиба, а другой - элементом последовательности.Естественно, он возвращает единственный результат - сгиб всех элементов последовательности в одно значение.

С другой стороны, std::transform копирует значения из одной последовательности в другую, применяяодинарная операция для каждого элемента.Он возвращает итератор в конец последовательности.

Тот факт, что вы можете указать любой код в качестве операции сгиба, позволяет использовать std::accumulate в качестве замены универсального цикла, включая возможность копирования значений в некоторые другиеконтейнер, но это неуместно, так как единственной причиной для введения этих (довольно простых) алгоритмов было сделать программы более явными.Создание одного алгоритма для выполнения задачи, которая обычно связана с другим алгоритмом, является менее явным и нелогичным.

Универсальный алгоритм замены цикла - std :: for_each , но с диапазоном для цикловон во многом устарел, и я давно его не видел.

3 голосов
/ 23 сентября 2019

Можем ли мы всегда заменить std::transform на std::accumulate?

Нет.Для cppreference std::accumulate двоичный предикат op имеет

op не должен делать недействительными какие-либо итераторы, в том числе конечные итераторы, и не изменять никакие элементы участвующего диапазона, а также *last.

Таким образом, он фактически не может преобразовать заданный вами диапазон, который является основным вариантом использования для std::transform.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...