【问题标题】:Is it possible to copy part of a vector using the array copy?是否可以使用数组副本复制向量的一部分?
【发布时间】:2013-07-02 02:31:47
【问题描述】:

How do you copy the contents of an array to a std::vector in C++ without looping? 有一个很好的例子,如何简单地将数组的内容复制到向量中。

你能用同样的技术将一个向量的一部分复制到另一个向量中吗?

例如

vector<int> v;

// ...v has some number of elements and we're interested in an 
// arbitrary number (y) from an arbitrary start point (x)...

vector<int> v2(&v[x], &v[x + y]);

【问题讨论】:

  • 如果您确定v 至少有x+y 元素,您可以使用该精确符号。但是,请考虑 chris 的答案,它更通用

标签: c++ vector stl


【解决方案1】:

是的,使用迭代器:

vector<int> v2(v.begin() + x, v.begin() + x + y);

如果你愿意,你可以让它更通用一点:

vector<int> v2(std::next(std::begin(v), x), std::next(std::begin(v), x + y));

指针版本(数组衰减到两个参数)首先起作用的原因是指针可以被视为随机访问迭代器。

【讨论】:

  • 在后一种情况下我需要启用 c++11 和 #include &lt;iterator&gt;,对吗?
  • 利用 ADL 节省几次击键:vector&lt;int&gt; v2(std::next(begin(v), x), std::next(begin(v), x + y));
  • 我认为 C++11 使 namespace std 成为 std::vector::iterator 的关联命名空间?那么查找不合格的next 应该会找到std::next,对吧? (节省一些额外的字符)
  • @Nawaz,MSalters,好吧,它仍然会变得不那么通用。您可以对数组使用相同的方法,但该数组绝对不适用于 ADL。我有点不确定我是否喜欢在运算符之外使用 ADL,因为资格的必要性通常会根据您提供的内容而改变,并且可能会使其他人(如果他们不熟悉 ADL)混淆您需要资格和然后在没有资格的情况下看到它可以工作,然后当他们用其他东西尝试它时会失败。
【解决方案2】:

我相信这应该可行:

vector<int> v2( v.begin() + x, v.begin() + x + y );

在另一个以前的答案中有更多信息:Best way to extract a subvector from a vector?

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 2014-09-30
    • 2013-08-14
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多