标准库提供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 开始,一直到 last - 1。如果 d_first 在 [first, last) 范围内,则行为未定义。在这种情况下,可以使用 std::copy_backward 代替。
注意
复制重叠范围时,std::copy 适用于向左复制(目标范围的开头在源范围之外),而 std::copy_backward 适用于向右复制(目标范围的结尾在源范围之外)源范围)。
template< class BidirIt1, class BidirIt2 > BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );
将由 [first, last) 定义的范围中的元素复制到以 d_last 结尾的另一个范围。以相反的顺序复制元素(首先复制最后一个元素),但保留它们的相对顺序。
如果 d_last 在 (first, last] 之内,则行为未定义。在这种情况下,必须使用 std::copy 而不是 std::copy_backward。
注意
复制重叠范围时,std::copy 适用于向左复制(目标范围的开头在源范围之外),而 std::copy_backward 适用于向右复制(目标范围的结尾在源范围之外)源范围)。