是否有与 memmove 等效的标准库?

ein*_*ica 3 c++ idioms memcpy memmove stdcopy

标准库提供了std::copy,它可以被视为 C 的泛化/泛化memcpy()。它还保持 , 的要求memcpy(),使范围 [ first, ) 与范围 [ , )last不相交;否则我们会有未定义的行为。d_firstd_first + std::distance(first, last)

我的问题:是否有一个通用版本std::memmove(即不提出该要求并且通常使用临时缓冲区来实现)?如果不是,怎么会呢?

bol*_*lov 5

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 );
Run Code Online (Sandbox Code Playgroud)

将 [first, last) 定义的范围中的元素复制到从 d_first 开始的另一个范围。

复制 [first, last) 范围内的所有元素,从第一个开始,一直到 last - 1。如果 d_first 在 [first, last) 范围内,则行为未定义。在这种情况下,可以使用 std::copy_backward 来代替。

注意
复制重叠范围时, std::copy 适用于向左复制(目标范围的开头超出源范围),而 std::copy_backward 适用于向右复制(目标范围的末尾超出源范围)源范围)。

std::向后复制

template< class BidirIt1, class BidirIt2 >
BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );
Run Code Online (Sandbox Code Playgroud)

将 [first, last) 定义的范围中的元素复制到以 d_last 结尾的另一个范围。以相反的顺序复制元素(首先复制最后一个元素),但保留它们的相对顺序。

如果 d_last 在 (first, last] 范围内,则行为未定义。在这种情况下,必须使用 std::copy 而不是 std::copy_backward。

注意
复制重叠范围时, std::copy 适用于向左复制(目标范围的开头超出源范围),而 std::copy_backward 适用于向右复制(目标范围的末尾超出源范围)源范围)。