为什么在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非常棘手,我可以看到库解决方案的参数。