我假设存在一个std::copy_n
,以便它可以与输入迭代器一起使用。出于某些原因,为什么没有std::move_n
?
答案 0 :(得分:6)
我认为答案可能很平凡。
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()
或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);
}
答案 1 :(得分:2)
有一个std::make_move_iterator
可以使任何迭代器适应提供右值。
将经过修改的输入迭代器发送到std::copy_n
将实现所需的效果,而不会增加太多噪声。