繁体   English   中英

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

[英]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_insertercopy 的一些文档。

除了已经提到的方法之外, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM