如何使用 std::copy 将给定范围的矢量正确复制到另一个矢量?
How do I correctly copy given range of vector to another vector using std::copy?
我找到了一些关于将矢量范围移动到另一个矢量的页面,但是我正在努力让它发挥作用。
我想将元素从 sourceVect
移动到 destVect
,并将 sourceVect[1]
到 sourceVect[1+numToCopy]
之间的元素移动到 sourceVect 的开头。我试图通过以下方式做到这一点:
vector<int> destVect;
vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
int numToCopy = 7;
vector<int>::iterator itSource = sourceVect.begin();
vector<int>::iterator itSourceEnd = sourceVect.begin();
advance(itSource, 1);
advance(itSourceEnd, 1+numToCopy);
std::copy(itSource, itSourceEnd, destVect.begin()); //copy(first,last,output vector ite)
for (vector<int>::iterator it = destVect.begin(); it != destVect.end(); ++it)
cout << ' ' << *it;
但我得到调试断言失败,向量迭代器 + 偏移量超出范围 Visual studio。请注意,我只是在 Visual Studio 2015 年尝试它,最后必须在 C++98 中为 mbed 实现,这意味着我不能使用 std::next
例如。
std::copy()
不会在目标容器中创建新元素。这意味着您需要创建具有正确大小的 destVect
:
vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
vector<int> destVect(sourceVect.size() - 1);
如果您无法使用正确的大小创建它,请稍后在您知道大小的位置调整大小:
destVect.resize(sourceVect.size() - 1);
您现在可以复制:
copy(sourceVect.begin() + 1, sourceVect.end(), destVect.begin());
但是,您可以只用正确的内容创建 destVect
。您无需手动复制任何内容:
vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
vector<int> destVect(sourceVect.begin() + 1, sourceVect.end());
这是最快的方法,而且(也许更重要的是)它不容易出错。如果您执行 std::copy
但目标容器的大小不够大,您最终会写入未分配的内存(缓冲区溢出)。
vector::iterator
一直支持+
,你不需要next
或advance
。最简单的方法是从一对迭代器初始化。
std::vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
std::vector<int>::iterator first = sourceVect.begin() + 1;
std::vector<int>::iterator last = first + numToCopy;
std::vector<int> destVect(first, last); // contains 2,3,4,5,6,7,8
如果您无法避免延迟声明 destVect
到您拥有适当的初始化程序的地步,您可以使用 assign
destVect.assign(first, last); // contains 2,3,4,5,6,7,8 overwriting whatever was there before
我找到了一些关于将矢量范围移动到另一个矢量的页面,但是我正在努力让它发挥作用。
我想将元素从 sourceVect
移动到 destVect
,并将 sourceVect[1]
到 sourceVect[1+numToCopy]
之间的元素移动到 sourceVect 的开头。我试图通过以下方式做到这一点:
vector<int> destVect;
vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
int numToCopy = 7;
vector<int>::iterator itSource = sourceVect.begin();
vector<int>::iterator itSourceEnd = sourceVect.begin();
advance(itSource, 1);
advance(itSourceEnd, 1+numToCopy);
std::copy(itSource, itSourceEnd, destVect.begin()); //copy(first,last,output vector ite)
for (vector<int>::iterator it = destVect.begin(); it != destVect.end(); ++it)
cout << ' ' << *it;
但我得到调试断言失败,向量迭代器 + 偏移量超出范围 Visual studio。请注意,我只是在 Visual Studio 2015 年尝试它,最后必须在 C++98 中为 mbed 实现,这意味着我不能使用 std::next
例如。
std::copy()
不会在目标容器中创建新元素。这意味着您需要创建具有正确大小的 destVect
:
vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
vector<int> destVect(sourceVect.size() - 1);
如果您无法使用正确的大小创建它,请稍后在您知道大小的位置调整大小:
destVect.resize(sourceVect.size() - 1);
您现在可以复制:
copy(sourceVect.begin() + 1, sourceVect.end(), destVect.begin());
但是,您可以只用正确的内容创建 destVect
。您无需手动复制任何内容:
vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
vector<int> destVect(sourceVect.begin() + 1, sourceVect.end());
这是最快的方法,而且(也许更重要的是)它不容易出错。如果您执行 std::copy
但目标容器的大小不够大,您最终会写入未分配的内存(缓冲区溢出)。
vector::iterator
一直支持+
,你不需要next
或advance
。最简单的方法是从一对迭代器初始化。
std::vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
std::vector<int>::iterator first = sourceVect.begin() + 1;
std::vector<int>::iterator last = first + numToCopy;
std::vector<int> destVect(first, last); // contains 2,3,4,5,6,7,8
如果您无法避免延迟声明 destVect
到您拥有适当的初始化程序的地步,您可以使用 assign
destVect.assign(first, last); // contains 2,3,4,5,6,7,8 overwriting whatever was there before