我试图找到一种方法将矢量元素复制到另一个矢量。
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是否是结束迭代器。在这种情况下,它会失败。没有这个烂摊子有没有更安全的方式?
答案 0 :(得分:1)
您可以使用std::copy
中的<algorithms>
和std::back_inserter
中的<iterator>
:
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的一些文档。
答案 1 :(得分:1)
除了已经提到的方法之外,std::vector
有一个构造函数可以完全按照你想要的方式执行(从给定开始和结束迭代器的范围中获取元素)。
std::vector<int> aVecNew(itBegin, ++itEnd);
答案 2 :(得分:0)
在一般情况下 - 目标向量确实存在 - copy到back_insert_iterator直到++itEnd
之前是正确的方式,但在你的情况下,
std::vector<int> aVecNew(itBegin, ++itEnd);
是适当的衡量标准。 std::vector
has 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
live在Coliru的