Что сказал @gregg плюс:
Формулировка в стандарте (параграф 2 N1905 25.2.3) запрещает функции преобразования напрямую изменять элементы в заданных диапазонах, то есть не может записывать в итератор ввода.Предполагается только вычислить значение, которое функция transform
затем присваивает итератору result
.Фактически, пункт 5 явно разрешает result
быть равным first
.
Полагаю, это может позволить реализациям выполнять проверки безопасности или оптимизации в определенных случаях.
Например, предположим, что transform
были специализированы для std::vector<char>
.На 32-битной машине реализация могла бы развернуть основной цикл 4 раза и выполнить 32-битные загрузки и сохранения вместо 8-битных.Понятно, что это не сработает, если первый вызов функции преобразования изменил диапазон ввода (оставшиеся 3 вызова перед сохранением будут затем работать с грязными данными).
Вот C ++ 03 для добавления одной строки3 для каждого значения отключено arr
:
std::transform(arr.begin(), arr.end(), arr.begin(), std::bind1st(std::plus<int>(), 3));