我正在尝试将C数组分配给C ++ std :: array。
我如何做到这一点,最干净的方式,而不需要制作不需要的副本等?
做的时候
int X[8];
std::array<int,8> Y = X;
我收到编译错误:&#34;没有合适的构造函数&#34;。
答案 0 :(得分:19)
没有从普通数组到std::array
的转换,但您可以将元素从一个复制到另一个:
std::copy(std::begin(X), std::end(X), std::begin(Y));
这是一个有效的例子:
#include <iostream>
#include <array>
#include <algorithm> // std::copy
int main() {
int X[8] = {0,1,2,3,4,5,6,7};
std::array<int,8> Y;
std::copy(std::begin(X), std::end(X), std::begin(Y));
for (int i: Y)
std::cout << i << " ";
std::cout << '\n';
return 0;
}
答案 1 :(得分:0)
我知道已经有一段时间了,但也许对某些人还是有用的。 上面提供的解决方案很棒,但是也许您会对一种不太优雅但可能更快的解决方案感兴趣:
#include <array>
#include <string.h>
using namespace std;
double A[4] = {1,2,3,4};
array<double, 4> B;
memcpy(B.data(), A, 4*sizeof(double));
可以在需要时以其他一些方式(更动态)确定数组大小,这只是一个想法。我尚未测试两种解决方案的性能。
这里建议的人要求提供适当的尺寸,否则可能会发生不好的事情。
编辑:
下面的注释使我进行了测试,除非有人真的试图最大限度地发挥性能,否则这是不值得的(每个循环来回复制测试):
B大小:100000个元素数组的100000个测试副本与memcpy循环计数为100000:
** copy()= 9.4986秒
** memcpy()= 9.45058秒
B大小:100000个元素数组的100000个测试副本与memcpy循环计数为100000:
** copy()= 8.88585秒
** memcpy()= 9.01923秒
B大小:100000个元素数组的100000个测试副本与memcpy循环计数为100000:
** copy()= 8.64099秒
** memcpy()= 8.62316秒
B大小:100000个元素数组的100000个测试副本与memcpy循环计数为100000:
** copy()= 8.97016秒
** memcpy()= 8.76941秒
答案 2 :(得分:-2)
我发现此链接对将C类型数组的元素复制到std :: array非常有用。 https://www.techiedelight.com/convert-c-style-array-into-std-array-container/
上面的链接介绍了不同的复制方式。