创建具有可变维数的 C++ 向量

Posted

技术标签:

【中文标题】创建具有可变维数的 C++ 向量【英文标题】:create c++ vector with variable dimension number 【发布时间】:2020-04-26 16:40:09 【问题描述】:

我试图在编译时创建一个维数未知的向量。

我在这里找到了一些谈论同一主题的话题,但没有像 Create n-dimensional vector with given sizes 和 C++: generate multidimensional vector of unknown depth 那样回答我的情况

我可以从上面的第一个链接中提取一个可行的解决方案(编译时没有错误),但我无法实现它。

template <typename T, int n>
struct NDVector 
    typedef std::vector<typename NDVector<T, n - 1>::type> type;
;

template <typename T>
struct NDVector<T, 0> 
    typedef T type;
;

template <typename T>
std::vector<T> make_vector_(std::size_t size) 
    return std::vector<T>(size);



template <typename T, typename... Args>
typename NDVector<T, sizeof...(Args) + 1>::type make_vector_(std::size_t first, Args... sizes) 
    typedef typename NDVector<T, sizeof...(Args) + 1>::type Result;
    return Result(first, make_vector_<T>(sizes...));

并创建我的向量变量,如下所示

NDVector<int,4> myVector;

这是唯一合理的解决方案,但我无法从 myVector 推送、擦除、清除....也不能使用下标符号 (myVector[x])。 这里的第二个问题是我不能在声明中使用变量 int 而不是常数(用变量更改数字 '4')。

我的目标是能够像这样声明向量:

unsigned n;
NDVector<int,n> myVector;

还可以像普通向量一样使用“myVector”变量

【问题讨论】:

抱歉,C++ 不能这样工作。每个对象的类型必须在编译时知道。这是 C++ 的基础。 我正在尝试在编译时创建一个维数未知的向量。 -- 听起来像XY problem 你想在这里创建一个向量吗? 模板参数必须是编译时间常数,但我认为可以在没有模板的情况下使用多态性来实现类似的目标。 也许A Class Template for N-Dimensional Generic Resizable Arrays 感兴趣 【参考方案1】:

这实际上比编译时解决方案简单得多。

您的类需要存储两个向量:一个用于边界(因为它们的计数在编译时未知),另一个用于实际数据(因此其大小为 bounds[0]*...*bounds[dim-1]) .

然后它需要订阅操作符,或者获取/设置函数。由于尚不知道维度,它们需要接受索引数组,而不是固定数量的参数。矢量非常合适。鉴于此,它可以计算内部数组中的索引,并返回对该特定元素的引用。

然后你可以尝试处理所有resize 的痛苦。或者只是不承诺在调整大小时保留任何数据。

【讨论】:

以上是关于创建具有可变维数的 C++ 向量的主要内容,如果未能解决你的问题,请参考以下文章

数学-线性代数导论-#10 线性相关性向量空间的基和维数

向量的几何意义是啥

Python:是否可以对具有多个维度的向量进行PCA?

什么是特征值和特征向量

向量空间的维数与空间向量的维数是不是相等??求解释,举个例子呗

如何将表示二进制的 int 向量转换为表示十进制数的 int 向量? C++