为什么c++标准库中没有std::transform_n函数?
Why is there no std::transform_n function in the C++ standard library?
我在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的特性。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在 transform() 中调用成员函数
- 如何在 std::transform 中使用 std::p ow 作为一元函数?
- 在集合上运行的函数模板,该集合具有默认的"transform"函数,该函数不执行任何操作
- 为什么在 std::transform 中使用函数对象参数失败并且需要 lambda 表达式
- 没有匹配函数用于调用 std::transform,未解析的重载函数类型
- 如何使用 std::transform() 函数
- KEIL 错误:没有与参数列表匹配的重载函数"std::transform"实例
- 使用 std::transform 调用对象的函数
- 获取CUDA推力::transform运算符()函数内向量的索引
- 我可以默认这个Transform模板函数的返回类型吗?
- 使用for_each或std::transform时,c++函函数构造函数是如何被调用的?
- c++的transform和lambda函数