[英]How to copy elements to a Vector if you are given a pair of iterators?
我试图找到一种将向量的元素复制到另一个向量的方法。
int main()
{
std::vector<int> aVec{0,1,2,3,4};
std::vector<int>::iterator itBegin = aVec.begin();
std::vector<int>::iterator itEnd = aVec.begin()+3;
std::vector<int> aVecNew;
// How to insert elements ranging from itBegin till itEnd(including itEnd) to
// the vector aVecNew
return 0;
}
大多数插入方法似乎不包括 itEnd。 有没有干净的方法来做到这一点?
编辑:如果我不确定 ++itEnd 是否是结束迭代器。 在这种情况下,它会失败。 有没有更安全的方法而不是一团糟?
您可以使用来自<algorithms>
std::copy
和来自<iterator>
std::back_inserter
:
int main(int a, char**){
std::vector<int> aVec{ 0, 1, 2, 3, 4 };
std::vector<int>::iterator itBegin = aVec.begin();
std::vector<int>::iterator itEnd = aVec.begin() + 3;
std::vector<int> aVecNew;
std::copy(itBegin, itEnd, std::back_inserter(aVecNew));
return 0;
}
PS:另外,正如评论中提到的,此代码复制不包括 itEnd。 如果要复制包含 itEnd 的元素,只需将其值增加 1:
int main(int a, char**){
std::vector<int> aVec{ 0, 1, 2, 3, 4 };
std::vector<int>::iterator itBegin = aVec.begin();
std::vector<int>::iterator itEnd = aVec.begin() + 3;
std::vector<int> aVecNew;
std::copy(itBegin, ++itEnd, std::back_inserter(aVecNew));
return 0;
}
关于back_inserter和copy 的一些文档。
除了已经提到的方法之外, std::vector
有一个构造函数,可以完全按照您的要求执行(从给定开始和结束迭代器的范围中获取元素)。
std::vector<int> aVecNew(itBegin, ++itEnd);
在一般情况下 - 目标向量确实已经存在 - 在++itEnd
之前复制到back_insert_iterator是正确的方法,但在你的情况下,
std::vector<int> aVecNew(itBegin, ++itEnd);
是适当的措施。 std::vector
有 ctor #(4) ; 没有理由先创建然后在此处填充vector
。
#include <vector>
#include <iostream>
#include <iterator> // ostream_iterator
#include <algorithm> // copy
int main()
{
std::vector<int> aVec{0,1,2,3,4}; // this is c++ of 2011 or later...
// ... thus this
std::vector<int>::iterator itBegin = aVec.begin();
std::vector<int>::iterator itEnd = aVec.begin() + 3;
// (if used) would at least be a case for "auto"
std::vector<int> aVecNew(itBegin, ++itEnd);
std::copy(aVecNew.begin(), aVecNew.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return EXIT_SUCCESS;
}
输出:
0 1 2 3
住在 Coliru's
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.