运行时 C++ N 个嵌套向量

Chr*_*ris 4 c++ arrays boost nested vector

在 C++(有或没有 boost)中,如何创建 N 维向量,其中 N 在运行时确定?

类似的东西:

PROCEDURE buildNVectors(int n)

std::vector < n dimensional std::vector > *structure = new std::vector< n dimensional std::vector >()

END
Run Code Online (Sandbox Code Playgroud)

如果传递 1,将分配一个向量。如果传递 2,将分配一个 2d 嵌套矩阵。如果传递 3,则分配一个 3d 立方体。等等。

Nat*_*ica 5

不幸的是,您将无法执行此操作。Astd::vector是模板类型,因此在编译时必须知道它的类型。由于它的类型用于确定它具有的维度,因此您只能在编译时进行设置。

好消息是您可以创建自己的类,使用单维向量作为数据存储,然后您可以使用数学假装它具有额外的维度。不过,这确实使访问向量变得棘手。由于您不知道向量有多少维,因此您需要有一种方法来索引具有任意数量元素的容器。您可以做的是使用 a 重载函数调用运算符运算符,std::intializer_list这将允许您使用类似的内容对其进行索引

my_fancy_dynamic_dimension_vector({x,y,z,a,b,c});
Run Code Online (Sandbox Code Playgroud)

你可以拥有的真正粗略的草图

class dynmic_vector
{
    std::vector<int> data;
    int multiply(std::initializer_list<int> dims)
    {
        int sum = 1;
        for (auto e : dims)
            sum *= e;
        return sum;
    }
public:
    dynmic_vector(std::initializer_list<int> dims) : data(multiply(dims)) {}
    int & operator()(std::initializer_list<int> indexs)
    {
        // code here to translate the values in indexes into a 1d position
    }
};
Run Code Online (Sandbox Code Playgroud)

或者更好的是,只需使用 boost::multi_array