本身复制矢量

时间:2018-12-18 19:44:33

标签: c++

我观看了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

2 个答案:

答案 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);