Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在C++;标准图书馆? 我在C++标准草案中没有提到转换函数。_C++_C++11_Stl Algorithm - Fatal编程技术网

为什么在C++;标准图书馆? 我在C++标准草案中没有提到转换函数。

为什么在C++;标准图书馆? 我在C++标准草案中没有提到转换函数。,c++,c++11,stl-algorithm,C++,C++11,Stl Algorithm,这是故意的吗?如果没有,人们将如何为标准的未来版本提出这一建议 以下是我将如何实施它: template<typename _InputIterator, typename Size, typename _OutputIterator, typename _UnaryOperation> _OutputIterator transform_n(_InputIterator __first, Size __n, _OutputIterator __result, _UnaryO

这是故意的吗?如果没有,人们将如何为标准的未来版本提出这一建议

以下是我将如何实施它:

    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;
}
模板
_输出迭代器转换(先输入迭代器,后大小,后输出迭代器,后结果,后运算){

对于(Size i=0;i这里是另一个可能的实现,它表明已经有一个具有等效功能的库函数:

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++);
                             });
}
模板
_输出迭代器转换(先输入迭代器,
尺寸,
_输出计数器结果,
_一元运算(op){
返回std::generate_n(__结果,__n,
[&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
返回_op(*_first++);
});
}
正如@TonyD在一篇评论中提到的,这会强制转换按顺序进行,但如果输入迭代器参数实际上只是一个输入迭代器,情况已经是这样了


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

请参阅。一定要想出一些引人注目的用例。@TonyD:这不仅仅是因为它节省了您的时间,因为您不能两次通过同一个输入迭代器。但是您可以使用带有lambda的
std::generate\n
。我更感兴趣的是在迭代器(或范围)本身中对其进行编码,而不是每个算法都有一个
\n
版本。例如,Eric Niebler的,它有
take(n)
adapter,它接受一个范围的前N个元素。@rici:
std::generate\u N
必须按顺序调用生成器,而
std::transform
可以按任何顺序进行,因此在某些情况下,
generate\u N
方法可能会以性能为代价。@rici尽管
generate\u N
使用generator,因此您必须在生成器中捕获原始范围的迭代器。lambda应该返回
decltype(auto)
@T.C.:好的。我还让它(正确地,我认为)通过generate\n的返回值。
decltype(auto)点
就是让lambda返回调用
\uuuu op
所返回的内容。如果调用返回某个引用,您就不想进行复制-所说的内容甚至可能不可复制!C++11等价物是
->decltype(/*表达式返回*/)
.TBH,正确使用lambda非常棘手,我可以看到库解决方案的参数。