我观看了this谈话(包括时间戳记)。发言人说,要进行修改
{1,2,3,4,5,6,7,8,9,10}-> {1,2,3, 1,2,3,4,5 , 9,10}
他使用了std::copy
,它崩溃了,所以您应该改用std::copy_backward
。
但是根据我的经验,反之亦然。
https://wandbox.org/permlink/hDjMhubAg1vb1KZz
int main()
{
std::vector<int> v {1,2,3,4,5,6,7,8,9,10};
std::copy(v.begin(), v.begin()+5, v.begin()+3);
for(const auto& i : v)
std::cout<<i<<',';
}
这很好用。而std::copy_backward
就是崩溃了。
我看不见东西吗?还是说话人误会?
编辑:我的错误是假定两个函数对参数的解释相同。对于std::copy_backward
,我应该使用v.end()-2
而不是v.begin()+3
。
答案 0 :(得分:4)
它没有崩溃的事实没有任何意义。根据标准,如果目标迭代器在[first,last)范围内,则std::copy
未定义-这就是您的情况。众所周知,不崩溃只是未定义行为的可能表现之一。
为了知道您的std::copy_backwards
崩溃的原因,我们需要查看使用它的代码。我怀疑您没有正确使用它(不是{strong>不是的std::copy
的直接替代,您需要相应地更改参数)。
答案 1 :(得分:2)
如果输出迭代器位于两个输入迭代器之间,则behavior is undefined。它对您的示例有用的事实是偶然的。
对于std::copy_backward
,第三个参数是 last 输出元素的迭代器。因此,您必须将示例更改为:
std::copy_backward(v.begin(), v.begin()+5, v.begin()+8);