【发布时间】:2014-02-13 15:38:55
【问题描述】:
STL 定义了两种风格的 transform 函数
第一个是对于一元运算符:
template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform (InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperation op);
第二个是二元运算符:
template <class InputIterator1, class InputIterator2,
class OutputIterator, class BinaryOperation>
OutputIterator transform (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
BinaryOperation binary_op);
对于三元运算符,类似函数的最有效实现是什么?
编辑: 这是我想出的微不足道的实现,但没有更精简和更优雅的解决方案吗?
template <class InputIterator1, class InputIterator2, class InputIterator3,
class OutputIterator, class TrenaryOperation>
OutputIterator transform3(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator3 first3, OutputIterator result,
TrenaryOperation trenary_op)
{
while (first1 != last1) {
*result = trenary_op(*first1, *first2, *first3);
++result; ++first1; ++first2; ++first3;
}
return result;
}
【问题讨论】:
-
您的链接提供的示例有什么问题?只需将二元运算替换为三元运算即可。
-
@knivil 我猜 cplusplus.com 的实现是为了演示而非效率目的。
-
*result++ = ternary_op(*first1++, *first2++, *first3++);短了一行 ;) (虽然可以说可读性较差) -
@zr。我认为您的“简单实现”很棒。我怀疑您对效率的担忧是没有根据的——您是否进行了基准测试?仅供参考,隐藏循环(使用 STL 或其他方式)不会神奇地让您的程序更快。
-
transform(first1, last1, result, [&first2, &first3, &ternary_op](decltype(*first1) f1) { return ternary_op(f1, *first2++, *first3++); });没有显式循环,但真的很丑。