std :: copy是否处理重叠范围?

Adr*_*thy 21 c++ algorithm stl copy

将数据从一个范围复制到另一个范围时,如果源范围和目标范围之间存在部分重叠,则必须小心.如果目标范围的开头与源范围的尾部重叠,则普通顺序副本将使数据混乱.C运行时库具有memmovememcpy处理这种重叠的问题.

我假设这样的std::copy工作memcpy,因为它不考虑源和目标区域之间的重叠.如果您尝试在std::vectorwith中"向下"移动对象std::copy,则会破坏数据.是否有STL算法类似于memmove处理这样的情况?或者我应该使用反向迭代器自己滚动?

Joh*_*lla 18

如果输出范围的开头与输入范围重叠,则它不处理重叠范围.

幸运的是,您可以使用std::copy_backward(这要求您不要将输出范围的末尾与输入范围重叠).


Alo*_*lon 9

前提条件std::copy,禁止重叠:

  • 原型

    template <class InputIterator, class OutputIterator>
    OutputIterator copy(InputIterator first, InputIterator last,
                        OutputIterator result);
    
    Run Code Online (Sandbox Code Playgroud)
  • 前提条件

    • [first, last) 是一个有效的范围.
    • 结果不是范围内的迭代器[first, last).
    • 有足够的空间来容纳所有被复制的元素.更正式地说,要求是 [result, result + (last - first))有效范围.[1]

  • 这仅禁止与目标范围的开始重叠.正如John所说,允许与中间或结尾重叠,并且`std :: copy_backward`允许与开头(但不是结尾)重叠. (3认同)