【问题标题】:Is there a standard library equivalent of memmove?是否有等同于 memmove 的标准库?
【发布时间】:2021-09-04 02:59:51
【问题描述】:

标准库提供std::copy,可以看作是C 语言memcpy() 的泛化/泛化。它还维护了memcpy() 的要求,因为范围 [first, last) 与范围 [d_first, d_first + std::distance(first, last)) 不相交;否则我们有未定义的行为。

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

【问题讨论】:

  • std::copy 并不是std::memcpy 的真正概括。它们有非常不同的语义。如std::copy 复制对象,而std::memcpy 进行逐字节复制。
  • @bolov memmove 无论重叠在哪个方向都是安全的。std::copy_backward 不是。

标签: c++ memcpy idioms memmove stdcopy


【解决方案1】:

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 开始复制 [first, last) 范围内的所有元素 继续最后 - 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 结尾的范围。元素被反向复制 顺序(最后一个元素首先复制),但它们的相对顺序是 保存。

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

注意事项
复制重叠范围时,std::copy 适用于向左复制(目标开头 范围在源范围之外)而 std::copy_backward 是 向右复制时合适(目标范围的末尾是 源范围之外)。

【讨论】:

    猜你喜欢
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多