如何初始化未知大小的多维矢量,C++
问题描述:
在我的项目中我需要通过std:vector创建可变多维矩阵,大小可变。我发现下面正确的代码,这可以创建此:如何初始化未知大小的多维矢量,C++
template<typename T, std::size_t N>
struct md_vector
{
using type = std::vector<typename md_vector<T, N - 1>::type>;
};
template<typename T>
struct md_vector<T, 1>
{
using type = std::vector<T>;
};
Template<typename T, std::size_t N>
using md_vector_t = typename md_vector<T, N>::type;
//using
//this create 3 dimensional vectors of int - std:vector<std:vector<std:vector<int>>>
md_vector_t<int, 3> matrix;
但现在我不知道何用这个矩阵?我想初始化整个矩阵为0 ....通过示例4维矩阵,每个向量7整数... 7 x 7 x 7 x 7整数?初始化后我可以赋值?矩阵[0] [0] [0] [0] - 这我不能,因为我不知道尺寸大小。
非常感谢您的一些建议...
答
应对这种疯狂的情况下,最简单的方法是使用resize()
。让编译器找出如何初始化向量:
md_vector_t<int, 4> matrix;
matrix.resize(7);
这将调整第一个维度的大小。现在,您需要调整第一个维度中的每个单独元素的大小,以构建第二个维度。
for (auto &a:matrix)
a.resize(7);
不久之前,你会弄清楚如何让范围迭代为你工作。这样的事情:
md_vector_t<int, 4> matrix;
matrix.resize(7);
for (auto &a:matrix)
{
a.resize(7);
for (auto &b:a)
{
b.resize(7);
for (auto &c:b)
{
c.resize(7);
}
}
}
在我的手指计数这个,我非常确定这将初始化所有四个维度在这里。
在C++ 11之前,这将是痛苦。
现在,我不确定你为什么说“矩阵[0] [0] [0] [0] - 这我不能,我不知道尺寸大小”。因为这正是你如何在这个吸盘上偷看和捅捅的方式。
矩阵中的每个元素将被值构造为0.如果您想将值初始化为其他值,只需使用相同的嵌套范围迭代方法来初始化值。
现在,就用于初始化任意维数矩阵的模板而言,采用相同的方法并使用与现有模板相同的方法应该是微不足道的:1维矢量的专门化,以及调用resize()
的默认模板,然后执行范围迭代以对其容器中的值进行递归调用。
只是为了确保我正在阅读这个权利,您不知道您是否有说矢量矢量或矢量矢量矢量矢量矢量的矢量,直到运行时? – user4581301
然而,这不可能,是吗?编译时必须知道所有类型。 – xaxxon
除非在编译时知道尺寸,否则不能使用矢量。 – xaxxon