如何初始化未知大小的多维向量,C++

How initialize multi dimensional vectors of an unknown size, C++

本文关键字:向量 C++ 初始化 未知      更新时间:2023-10-16

在我的项目中,我需要通过具有可变大小的 std:vector 创建可变多维矩阵。我在下面找到了正确的代码,可以创建这个:

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。如果要将值初始化为其他值,只需使用相同的嵌套范围迭代方法来初始化值。

现在,就初始化任意维度矩阵的模板而言,采用与现有模板相同的方法并使用相同的方法应该是微不足道的:一维向量的专用化,以及调用resize()的默认模板,然后执行范围迭代以递归调用其容器中的值。