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


我试图将C数组分配给C ++ std :: array。

我怎么做,最干净的方式,没有不需要的副本等?

做的时候

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

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


11201
2017-10-06 15:35


起源

注意 std::array 没有用户定义的构造函数,因为将其状态保持为聚合类型被认为是重要的。 - Benjamin Lindley


答案:


没有从普通数组转换为 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;
}

15
2017-10-06 15:37



<array> 保证你 std::begin 和 std::end 已经;没必要 <iterator>。 - T.C.
@ T.C。我找不到,至少不是在C ++ 11标准中。你有参考吗? - juanchopanza
@juanchopanza 24.6.5 / 1:“除了可以通过包含 <iterator> 标题,24.6.5中的函数模板[重载的 std::begin 和 std::end如果包含以下任何标题,则可用: <array>, <deque>, <forward_list>, <list>, <map>, <regex>, <set>, <string>, <unordered_map>, <unordered_set>,和 <vector>“。 - Casey
@stupidlearner std::copy 是不安全的 std::copy_n。为什么你认为 std::copy_n 是安全的? - Rakete1111
@Rakete1111我没说 copy_n 是安全的。我正在考虑使用 copy_n 将迫使程序员考虑复制的正确大小,从而减少隐藏溢出错误的可能性。但这似乎不正确,因为它取决于。谢谢你指出。 - stupidlearner