我假设有一个,std::copy_n以便可以与输入迭代器一起使用。是否std::move_n出于某些原因而没有原因?
我认为答案可能很平凡。
std::copy 它永远存在,它是C ++ 03中这些算法中唯一的一种。
N1377(2002)在语言中添加了移动语义,并引入了算法std::move()并std::move_backward()镜像了现有的std::copy()和std::copy_backward()。这些是现有的唯一复制算法-因此,这是唯一获得move版本的算法。
N2569(2008)加入了一堆多种算法,其中大部分是在原有的标准模板库的实现存在-这是std::copy_n()和std::copy_if()来自何处。由于本文的前提是一堆已经存在并使用多年的算法,因此不能包含std::move_n()or std::move_if()。似乎根本没有考虑到这一点。
我猜这些是否会以相反的顺序发生,我们std::move_n()今天可能会发生。但是在这一点上,可能不值得添加。因为,std::copy_n()甚至不经常使用,move_n并且很容易实现:
template< class InputIt, class Size, class OutputIt>
OutputIt move_n(InputIt first, Size count, OutputIt result)
{
return std::copy_n(std::make_move_iterator(first), count, result);
}
Run Code Online (Sandbox Code Playgroud)
有一个std::make_move_iterator可以使任何迭代器适应提供右值。
发送一个适应的输入迭代器将std::copy_n达到所需的效果,而不会增加太多噪音。