问题描述
标准库提供了 std::copy
,可以将其视为 C 的 memcpy()
的泛化/泛化。它还保持了 memcpy()
的要求,范围 [first
,last
) 与范围 [d_first
,d_first + std::distance(first,last)
) 不相交;否则我们有未定义的行为。
我的问题:是否有通用版本的 std::memmove
(即它没有提出该要求并且通常使用临时缓冲区来实现)?如果没有,怎么会?
解决方法
C++ 没有替代 memcpy
和 memmove
。
对于非重叠范围,通常使用 std::copy
,但也可以使用 std::copy_backwards
。
对于重叠范围,您需要根据重叠的性质使用 std::copy
或 std::copy_backwards
。
如果原始对象不需要保留其值,也可以分别用于复制昂贵的对象 std::move
(<algorithm>
) 和 std::move_backward
。
template< class InputIt,class OutputIt >
OutputIt copy( InputIt first,InputIt last,OutputIt d_first );
将[first,last)定义的范围内的元素复制到另一个 范围从 d_first 开始。
复制范围 [first,last) 中的所有元素,从 first 和 继续到最后 - 1. 如果 d_first 在范围内,则行为未定义 范围[第一个,最后一个)。在这种情况下,可以使用 std::copy_backward 相反。
注意事项
复制重叠范围时,std::copy 适用于复制
向左(目标范围的起点在源范围之外
range) 而 std::copy_backward 在复制到
右(目标范围的末端在源范围之外)。
template< class BidirIt1,class BidirIt2 >
BidirIt2 copy_backward( BidirIt1 first,BidirIt1 last,BidirIt2 d_last );
复制范围内的元素,由 [first,last) 定义,到 另一个以 d_last 结尾的范围。元素被反向复制 order(最后一个元素先复制),但它们的相对顺序是 保存。
如果 d_last 在 (first,last] 内,则行为未定义。std::copy 在这种情况下,必须使用 std::copy_backward 代替。
注意事项
复制重叠范围时,std::copy 适用于向左复制(目标的开头)
范围在源范围之外)而 std::copy_backward 是
向右复制时适当(目标范围的末尾是
源范围之外)。