将std::vector复制到std::array中

33

我该如何将 std::vector<T> 的前 n 个元素复制或移动到一个 C++11 的 std::array<T, n> 中?


12
std::copy_n是C++标准库中的一个算法,用于将一个指定数量的元素从一个容器复制到另一个容器。源和目标区间都由迭代器指定。 - Some programmer dude
你想复制还是移动?这两个操作是不同的。 - juanchopanza
根据::std::vector的内容,也可以使用::std::memcpy::std::memmove - user1095108
1
或者在 C++ 中使用 std::uninitialized_copy :) - legends2k
2个回答

49

使用std::copy_n

std::array<T, N> arr;
std::copy_n(vec.begin(), N, arr.begin());

编辑:我没有注意到您也问了如何移动元素。 要移动,请将源迭代器包装在std::move_iterator中。

std::copy_n(std::make_move_iterator(v.begin()), N, arr.begin());

1
这里的N是常量吗?array<T,N>中的N应该是常量。 - notbad
@notbad 是的,N 是常量(猜测我应该使用问题中提到的 n)。 - Praetorian
4
还有 std::move。遗憾的是,没有 std::move_n - R. Martinho Fernandes
如果大小N不正确会发生什么?例如,向量有5个元素,数组想要复制10个?Cpp文档页面对此有点不清楚。 - peter karasev
@peterkarasev 您传递给copy_n的元素数量需要是向量和数组大小的最小值。否则,您将读取超出源边界或写入超出目标边界,这两种行为都是未定义的。 - Praetorian
1
@Praetorian 未定义... 因此,某些编译器可能会抛出异常,否则它将覆盖一些内存?我希望它会抛出异常,否则与原始数组相比,有什么好处呢?原始数组在越界时会默默地破坏内存。 - peter karasev

10
你可以使用 std::copy:
int n = 2;
std::vector<int> x {1, 2, 3};
std::array<int, 2> y;
std::copy(x.begin(), x.begin() + n, y.begin());

这里有一个实时例子,请点击这里

如果您想要移动,那么您可以使用std::move

int n = 2;
std::vector<int> x {1, 2, 3};
std::array<int, 2> y;
std::move(x.begin(), x.begin() + n, y.begin());

这里是另一个实时示例,点击此处查看。


n怎么办?不应该是std::copy(x.begin(), x.begin() + n, y.begin());吗? - legends2k
1
使用变量 n,不如使用 x.size() 更好,你觉得呢? - Arnav Borborah
你可以使用 x.size(),但它不会编译 - 这里的 N 是一个编译时常量,甚至是一个模板参数。 std::array 就像一个数组 - 它需要在编译时知道大小。 就这样。 - foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接