C++ 复制与复制的区别

C++ 复制与复制的区别,c++,difference,C++,Difference,以下两者之间的区别?哪一个有未定义的行为?两者都有 std::copy_n(asdf.begin(), asdf.size(), asdf.begin()); std::copy(asdf.begin(), asdf.end(), asdf.begin()); 假设函数给定了一个std::vector。这两种功能并不像有些人所说的一样 这是标准中的缺陷吗 std::copy_n(asdf.begin(), asdf.size(), asdf.begin()); 这不是未定义的行为copy\n

以下两者之间的区别?哪一个有未定义的行为?两者都有

std::copy_n(asdf.begin(), asdf.size(), asdf.begin());
std::copy(asdf.begin(), asdf.end(), asdf.begin());
假设函数给定了一个
std::vector
。这两种功能并不像有些人所说的一样

这是标准中的缺陷吗

std::copy_n(asdf.begin(), asdf.size(), asdf.begin());
这不是未定义的行为
copy\n
只要求
[first,first+n)
[result,result+n)
是有效的范围。对于您传递的参数,您保证它们是有效的。(我假设
asdf
是一个标准容器,或者是一个具有类似行为的容器。我还假设所包含的类型有一个行为良好的赋值运算符)


这有未定义的行为。对于
std::copy
result
不能在范围
[第一、最后一个]

它们都可以有未定义的行为。一个按数量复制,另一个按范围复制。上面哪一个有未定义的行为?不仅仅是功能。如果提供的大小大于内存,则
复制将有未定义的行为。如果
结束()
开始()
复制中的迭代器超出范围,您将有未定义的行为。这两者都是,取决于提供给函数的值。这怎么可能“太宽”?答案,不管是什么,都是直截了当的。我之所以投票,是因为这是一个完全合理的问题。@Falmari好的,从技术上来说,这个问题应该澄清一下,但别这样。你知道它在问什么。有理由假设
asdf
是一个标准容器或是一个适当兼容的容器。你说的是
copy\n
c自我复制但不能?我不知道。为什么会这样?@NeilKirk:我不知道为什么。但这就是标准所说的。
copy
直接列出了这个要求,
copy\n
没有。@NeilKirk因为标准([alg.copy]))是这样说的吗?可能是这样的,
copy
可以委托给
memcpy
,用于普通的可复制类型。如果你想让输出范围的起始部分与要处理的源范围重叠,那么就有
copy\u backward
。@Praetorian但是
copy\n
不应该委托给
memcpy
?@kirk推测ing…
copy\n
需要保持计数,因此它不能像
copy
那样求助于大容量内存复制。
std::copy(asdf.begin(), asdf.end(), asdf.begin());