为什么c++标准库中没有std::transform_n函数?

Why is there no std::transform_n function in the C++ standard library?

本文关键字:transform 函数 std 标准 c++ 为什么      更新时间:2023-10-16

我在c++标准草案N4431中找不到transform_n函数的提及。

这是故意的吗?如果不是这样,人们又如何为标准的未来版本提出这样的建议呢?

我将如何实现它:

    template<typename _InputIterator, typename Size, typename _OutputIterator, typename _UnaryOperation>
_OutputIterator transform_n(_InputIterator __first, Size __n, _OutputIterator __result, _UnaryOperation __op) {
    for(Size i=0;i<__n;++i)
        *__result++ = __op(*__first++);
    return __result;
}

template<typename _InputIterator1, typename Size, typename _InputIterator2, typename _OutputIterator, typename _BinaryOperation>
_OutputIterator transform_n(_InputIterator1 __first1, Size __n, _InputIterator2 __first2, _OutputIterator __result, _BinaryOperation __binary_op) {
    for(Size i=0;i<__n;++i)
        *__result++ = __binary_op(*__first1++, *__first2++);
    return __result;
}

这里是另一个可能的实现,它表明已经有一个具有等效功能的库函数:

template<typename _InputIterator,
         typename _OutputIterator,
         typename _UnaryOperation>
_OutputIterator transform_n(_InputIterator __first,
                            size_t __n,
                            _OutputIterator __result,
                            _UnaryOperation __op) {
      return std::generate_n(__result, __n,
                             [&__first, &__op]() -> decltype(auto) {
                                return __op(*__first++);
                             });
}

正如@TonyD在评论中提到的那样,这样做的效果是强制转换按顺序进行,但如果输入迭代器参数实际上只是一个输入迭代器,情况就已经是这样了。

编辑:根据@T.C的建议。,我将lambda更改为具有decltype(auto)的返回类型,这(如果我理解正确的话)可以允许通过输出迭代器移动语义。这需要最新的编译器,因为这是c++ 14的特性。