将C数组分配给C++';s std::数组?(std::array<;T,U>;=T[U])-不存在来自";T[U]”;至;std::数组<;T、 U>&引用; 我尝试将C数组赋值给C++ STD::数组。

将C数组分配给C++';s std::数组?(std::array<;T,U>;=T[U])-不存在来自";T[U]”;至;std::数组<;T、 U>&引用; 我尝试将C数组赋值给C++ STD::数组。,c++,c,arrays,c++11,C++,C,Arrays,C++11,我如何做到这一点,以最干净的方式,不制作不必要的副本等 当做 int X[8]; std::array<int,8> Y = X; intx[8]; std::数组Y=X; 我得到一个编译器错误:“不存在合适的构造函数”。没有从普通数组到std::array的转换,但是您可以将元素从一个复制到另一个: std::copy(std::begin(X), std::end(X), std::begin(Y)); 下面是一个工作示例: #include <iostream>

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

当做

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

我得到一个编译器错误:“不存在合适的构造函数”。

没有从普通数组到
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;
}
#包括
#包括
#包括//标准::复制
int main(){
int X[8]={0,1,2,3,4,5,6,7};
std::数组Y;
std::copy(std::begin(X)、std::end(X)、std::begin(Y));
for(int i:Y)

我知道这已经有一段时间了,但也许对某些人还是有用的。 上面提供的解决方案非常好,但是您可能会对不那么优雅但可能更快的解决方案感兴趣:

#包括
#包括
使用名称空间std;
双A[4]={1,2,3,4};
阵列B;
memcpy(B.data(),A,4*sizeof(double));
当需要时,可以通过其他(更动态的)方式确定阵列大小,这里只是一个想法。我还没有测试这两种解决方案的性能

这里建议的需要提供适当的大小,否则会发生不好的事情

编辑:
下面的评论让我做了测试,除非有人真的想最大限度地提高性能,否则这是不值得的(每个循环来回复制测试):
B大小:100000个循环计数为100000的100000个元素阵列上的100000个测试副本与memcpy: **复制()=9.4986秒
**memcpy()=9.45058秒
B大小:100000个循环计数为100000的100000个元素阵列上的100000个测试副本与memcpy: **复制()=8.88585秒
**memcpy()=9.01923秒
B大小:100000个循环计数为100000的100000个元素阵列上的100000个测试副本与memcpy: **复制()=8.64099秒
**memcpy()=8.62316秒
B大小:100000个循环计数为100000的100000个元素阵列上的100000个测试副本与memcpy: **复制()=8.97016秒

**memcpy()=8.76941秒

保证您已经
std::begin
std::end
;不需要
@T.C。我找不到,至少在C++11标准中找不到。您有参考资料吗?@juanchopanza 24.6.5/1:“除了通过包含
标题可用外,24.6.5[标准:开始
和标准:结束
的重载]中的函数模板包含以下标题时可用:
,以及
。"@stupidlearner
std::copy
std::copy\n
一样不安全。为什么你认为
std::copy\n
是安全的?@raket1111我没有说
copy\n
是安全的。我想使用
copy\n
会迫使程序员考虑正确的复制大小,从而减少隐藏溢出错误的可能性。但是这似乎并不正确。感谢您指出。请注意,
std::array
没有用户定义的构造函数,因为它被认为保持其聚合类型的状态很重要。对于
memcpy
中的size参数,使用
sizeof(A)
更简单、更健壮,这与粗体的语句“更快的一个”相当还有一句话是“未测试性能”。AFAIK:=>std::copy对于编译器来说与memcpy相同(即std::copy调用memcpy,或者只是得到矢量化)。所有有效的注释。正如我所写的,它“可能”更快,因为我没有测试它。但是你的评论让我做了测试,并且区别不值得使用“memcpy”的丑陋-它们几乎相同,“memcpy”只是稍微快一点。