Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从向量初始化数组?(如何将指针投射到数组?)_C++_Arrays_C++11_Casting - Fatal编程技术网

C++ 如何从向量初始化数组?(如何将指针投射到数组?)

C++ 如何从向量初始化数组?(如何将指针投射到数组?),c++,arrays,c++11,casting,C++,Arrays,C++11,Casting,我正在尝试从std::vector的数据构建std::array。我目前做了以下工作: #include <vector> #include <array> int main(void) { std::vector<int> vec{{1, 2, 3, 4, 5}}; std::array<int, 5> arr{static_cast<int [5]>(vec.data())}; (void)arr

我正在尝试从
std::vector
的数据构建
std::array
。我目前做了以下工作:

#include <vector>
#include <array>

int main(void)
{
    std::vector<int>    vec{{1, 2, 3, 4, 5}};
    std::array<int, 5>  arr{static_cast<int [5]>(vec.data())};

    (void)arr;
    return 0;
}
#include <vector>
#include <array>

int main(void)
{
    std::vector<int>    vec{{1, 2, 3, 4, 5}};
    int                 *a(vec.data());
    std::array<int, 5>  arr{*reinterpret_cast<int (*)[5]>(&a)};

    (void)arr;
    return 0;
}
但数组不初始化。。。gcc表示:

错误:必须使用大括号内的初始值设定项初始化数组


std::array
是聚合类型;它没有任何用户定义的构造函数。它的单个数据成员是数组,不能在函数或构造函数调用中传递;通过值传递的数组衰减为指向其第一个元素的指针,并返回一个

这意味着一个
数组
只能由另一个
数组
或由
{}
-封闭列表中最多为
N
类型的
T
值的文字序列初始化

在C++17中,您将能够使用库函数将对数组的引用转换为
std::array

std::array<int, 5>  arr{std::experimental::to_array(*reinterpret_cast<int (*)[5]>(&a))};

std::array
是聚合类型;它没有任何用户定义的构造函数。它的单个数据成员是数组,不能在函数或构造函数调用中传递;通过值传递的数组衰减为指向其第一个元素的指针,并返回一个

这意味着一个
数组
只能由另一个
数组
或由
{}
-封闭列表中最多为
N
类型的
T
值的文字序列初始化

在C++17中,您将能够使用库函数将对数组的引用转换为
std::array

std::array<int, 5>  arr{std::experimental::to_array(*reinterpret_cast<int (*)[5]>(&a))};
参考文献:

数组类是聚合类型,因此没有自定义构造函数

您应该使用默认初始化来构造它,然后将向量内容复制到其中。

来自参考:

数组类是聚合类型,因此没有自定义构造函数

您应该使用默认初始化来构造它,然后将向量内容复制到其中。

“我认为数组可以用作指针,为什么我们不能执行此强制转换?”

可以使用数组作为指针,因为它们“衰减”到数组。看

但事实并非如此。(在不同大小的阵列上也有类型检查。)

虽然可以使用
static\u cast
来反转某些隐式转换,但这不是其中之一。明确地说:

5) 如果存在从新类型到表达式类型的标准转换序列,不包括左值到右值、数组到指针、函数到指针、空指针、空成员指针、函数指针(自C++17起)或布尔转换,然后,static_cast可以执行隐式转换的相反操作

因此,这可能会让您想知道如何将指针转换为数组类型。你不能,因为
重新解释\u cast
也不起作用

(如果您尝试使用C样式的转换,如<代码>(int [5)](VEC.DATA())< /C> >您可能会得到更明确的消息<强> ISO C++禁止将数组转换为INT[INT](5)'< /强>) 这就是语言实现失败的原因。这里,您正在尝试初始化一个

std::array
,它的存在理由是:

此容器是一个聚合类型,其语义与将C样式数组T[N]作为其唯一非静态数据成员的结构相同

因此,当涉及到初始化表单时,它将不能做任何你不能为C数组做的事情。如果你手里拿着一个整数指针,想用这个指针初始化一个
int-arr[5]=…
,你也同样不走运。你必须复制它

在这种情况下,可以用

“我以为数组可以用作指针,为什么我们不能进行此转换?”

可以使用数组作为指针,因为它们“衰减”到数组。看

但事实并非如此。(在不同大小的阵列上也有类型检查。)

虽然可以使用
static\u cast
来反转某些隐式转换,但这不是其中之一。明确地说:

5) 如果存在从新类型到表达式类型的标准转换序列,不包括左值到右值、数组到指针、函数到指针、空指针、空成员指针、函数指针(自C++17起)或布尔转换,然后,static_cast可以执行隐式转换的相反操作

因此,这可能会让您想知道如何将指针转换为数组类型。你不能,因为
重新解释\u cast
也不起作用

(如果您尝试使用C样式的转换,如<代码>(int [5)](VEC.DATA())< /C> >您可能会得到更明确的消息<强> ISO C++禁止将数组转换为INT[INT](5)'< /强>) 这就是语言实现失败的原因。这里,您正在尝试初始化一个

std::array
,它的存在理由是:

此容器是一个聚合类型,其语义与将C样式数组T[N]作为其唯一非静态数据成员的结构相同

因此,当涉及到初始化表单时,它将不能做任何你不能为C数组做的事情。如果你手里拿着一个整数指针,想用这个指针初始化一个
int-arr[5]=…
,你也同样不走运。你必须复制它

在这种情况下,可以用


您可以使用递归模板来实现类似于所需的内容。诀窍是使用。。。可变模板中的运算符,其可变参数为所需的向量元素索引。在下面实现这一点的实现中,数组本身的构造在模板中完成,您可以依赖于return
#include <vector>
#include <array>
#include <iostream>

template<typename T, unsigned total_elem_count, unsigned remain_elem_count, unsigned... elements>
struct init_array_from_vec_helper
{   
    static std::array<T, total_elem_count> array_from_vec(const std::vector<T>& cont)
    {   
        return init_array_from_vec_helper<T, total_elem_count, remain_elem_count-1, remain_elem_count-1, elements...>::array_from_vec(cont);
    }   
};  


template<typename T, unsigned total_elem_count, unsigned... elements>
struct init_array_from_vec_helper<T, total_elem_count, 0, elements...>
{   
    static std::array<T, total_elem_count> array_from_vec(const std::vector<T>& cont)
    {   
        return std::array<T, total_elem_count>{cont[elements]...};
    }   
};  

template<typename T, unsigned total_elem_count>
std::array<T, total_elem_count> init_array_from_vec(const std::vector<T>& vec)
{   
    return init_array_from_vec_helper<int, total_elem_count, total_elem_count-1, total_elem_count-1>::array_from_vec(vec);
}   

int main(void)
{   
    std::vector<int>    vec{{1, 2, 3, 4, 5}};

    std::array<int, 5> arr(init_array_from_vec<int, 5>(vec));

    (void)arr;

    for(int i : arr)
        std::cout << i << std::endl;

    return 0;
}