如果您研究第一个可能的实现std::transform
template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first,
UnaryOperation unary_op)
{
while (first1 != last1) {
*d_first++ = unary_op(*first1++);
}
return d_first;
}
它可能看起来不“安全”。
然而,随着std::transform(str.begin(), str.end(),str.begin(), ::toupper);
d_first
并first1
指向同一个地方,但它们不是同一个迭代器!
在单个语句中递增这两个迭代器没有任何问题。
另一种实现是这样的(来自 MingW 头文件),它是等价的,但看起来更干净一些
template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first,
UnaryOperation unary_op)
{
for (; first1 != last1; ++first1, ++d_first)
*d_first = unary_op(*first1);
return d_first;
}
感谢 John Bartholomew编辑