C++ "copy"导致异常,而暴力破解工作正常

C++ "copy" causes exception while brute-force works fine

本文关键字:破解 工作 copy 异常 C++      更新时间:2023-10-16

我想在c++ VS2010中把一个int向量的一些值转换成一个不同的int向量。

一开始我尝试了蛮力的方式,它工作得很好:

for (int i=iStartPosInDst0based;i<=(iCountSrcItemsToCopy1based);i++)
{
    uIntegers[i]=nInts[i+iFirstItemInSrcToCopy0based];
}

然后我想更复杂一点,尝试使用"copy"。

copy(nInts.begin()+iFirstItemInSrcToCopy0based, uIntegers.begin()+iCountSrcItemsToCopy1based+iFirstItemInSrcToCopy0based, uIntegers.begin() +iStartPosInDst0based);

但是"copy"崩溃了

我很确定我的"复制"版本和我的"暴力"版本是一样的,但显然不是。但我不知道我哪里错了。有人能帮帮我吗?

这是因为你调用

copy(nInts.begin() + ..., uIntegers.begin() + ..., uIntegers.begin() + ...);

第二个迭代器应该是nInts的迭代器,像这样

copy(nInts.begin() + ..., nInts.begin() + ..., uIntegers.begin() + ...);

您以错误的顺序给copy参数。原型是

std::copy(InIt first, InIt last, OutIt result)

试试这个:

std::copy(
  nInts.begin() + iFirstItemInSrcToCopy0based
  , nInts.begin() + iFirstItemInSrcToCopy0based + iCountSrcItemsToCopy1based
  , uIntegers.begin() + iStartPosInDst0based
);

如果你可以访问c++ 11,你应该选择std::copy_n,因为你有很多元素要复制:

std::copy_n(
  nInts.begin() + iFirstItemInSrcToCopy0based
  , iCountSrcItemsToCopy1based
  , uIntegers.begin() + iStartPosInDst0based
);

我想你忘记在第一个迭代器参数中添加iStartPosInDst0basedcopy:

copy(nInts.begin()+iStartPosInDst0based+iFirstItemInSrcToCopy0based, uIntegers.begin()+iCountSrcItemsToCopy1based+iFirstItemInSrcToCopy0based, uIntegers.begin() +iStartPosInDst0based);

cplusplus.com所述

template <class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);

Output iterator to the initial position in the destination sequence.
This shall not point to any element in the range [first,last).

这似乎是这里的情况,因为你的最后一个参数类似于你的第二个(uIntegers)。

所以应该是

copy(nInts.begin()+ ..., nInts.begin()+ ..., uIntegers.begin() + );