是否有相当于 memmove 的标准库?

问题描述

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

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

解决方法

C++ 没有替代 memcpymemmove

对于非重叠范围,通常使用 std::copy,但也可以使用 std::copy_backwards

对于重叠范围,您需要根据重叠的性质使用 std::copystd::copy_backwards

如果原始对象不需要保留其值,也可以分别用于复制昂贵的对象 std::move (<algorithm>)std::move_backward

std::copy

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 在复制到 右(目标范围的末端在源范围之外)。

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 是 向右复制时适当(目标范围的末尾是 源范围之外)。