创建具有可变维数的 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++ 向量的主要内容,如果未能解决你的问题,请参考以下文章