如果给你一对迭代器,如何将元素复制到Vector?

时间:2015-11-11 14:09:42

标签: c++ vector stl

我试图找到一种方法将矢量元素复制到另一个矢量。

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是否是结束迭代器。在这种情况下,它会失败。没有这个烂摊子有没有更安全的方式?

3 个答案:

答案 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_insertercopy的一些文档。

答案 1 :(得分:1)

除了已经提到的方法之外,std::vector有一个构造函数可以完全按照你想要的方式执行(从给定开始和结束迭代器的范围中获取元素)。

std::vector<int> aVecNew(itBegin, ++itEnd);

答案 2 :(得分:0)

在一般情况下 - 目标向量确实存在 - copyback_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的

相关问题