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;
}