将C数组分配给C ++的std :: array? (std :: array <t,u> = T [U]) - 从“T [U]”到“std :: array <t,u>”</t,u> </t,不存在合适的构造函数U>

时间:2014-10-06 15:35:13

标签: c++ c arrays c++11

我正在尝试将C数组分配给C ++ std :: array。

我如何做到这一点,最干净的方式,而不需要制作不需要的副本等?

做的时候

int X[8];
std::array<int,8> Y = X;

我收到编译错误:&#34;没有合适的构造函数&#34;。

3 个答案:

答案 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/

上面的链接介绍了不同的复制方式。