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());