首页 > 解决方案 > 是否有等同于 memmove 的标准库?

问题描述

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

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

标签: c++memcpyidiomsmemmovestdcopy

解决方案


C++ 没有替换memcpymemmove

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

对于重叠范围,您需要使用std::copystd::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 适用于向右复制(目标范围的结尾在源范围之外)源范围)。

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 适用于向右复制(目标范围的结尾在源范围之外)源范围)。


推荐阅读