为什么没有std :: move_n算法?

时间:2019-04-03 18:55:47

标签: c++ c++17

我假设存在一个std::copy_n,以便它可以与输入迭代器一起使用。出于某些原因,为什么没有std::move_n

2 个答案:

答案 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将实现所需的效果,而不会增加太多噪声。