我想复制最多N个元素。
template< class InputIt, class Size, class OutputIt>
OutputIt myCopy_n(InputIt first, InputIt last, Size count, OutputIt result)
{
Size c = count;
while (first != last && c > 0) {
*result++ = *first++;
--c;
}
return result;
}
有没有使用标准函数的方法?我也可以:
template< class InputIt, class Size, class OutputIt>
OutputIt myCopy_n(InputIt first, InputIt last, Size count, OutputIt result)
{
if(std::distance(first, last) > count)
return std::copy_n(first,count,result);
return std::copy(first,last,result);
}
然而,除了笨重之外,它还要两次覆盖范围(距离、复制)。如果我正在使用转换迭代器或过滤器迭代器,那么这些都是对我的过滤/转换函数不必要的O(N)调用。
template <class InputIt, class OutputIt>
OutputIt copy_n_max(InputIt begin, InputIt end, OutputIt last, size_t count)
{
return std::copy_if(begin, end, last,
[&count](typename std::iterator_traits<InputIt>::reference)
{ return count--> 0; });
}
int main()
{
std::vector<int> v({1,2,3,4,5,6,7,8,9}), out;
copy_n_max(v.begin(), v.end(), std::back_inserter(out), 40);
for(int i : out) std::cout <<i << " ,";
}
输出为1,2,3,4,5,6,7,8,9,
然而,此过程将一直持续直到结束,并不计算时间。因此,仍会有更多不必要的调用到我的过滤/转换函数...
myCopy_n
。碰巧的是,这几乎完全符合我今天在https://dev59.com/HFQJ5IYBdhLWcg3wPTcn上提出的建议。其他解决方案似乎过于复杂和/或过于受限。保持简单。 - Lightness Races in Orbitcopy_n
无法表现出这种行为,因为它没有传递一个结束迭代器。 - Ben Voigt