我正在尝试在编译时创建一个维数未知的向量。
我在这里发现了一些主题相同的话题,但没有像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'变量
答案 0 :(得分:2)
实际上,它比编译时解决方案更简单。
您的类需要存储两个向量:一个用于边界(因为在编译时其计数未知),另一个用于实际数据(因此其大小为bounds [0] * ... * bounds [dim-1])
然后,它需要订阅运算符或get / set函数。由于尚不知道维数,因此它们需要接受索引数组,而不是固定数量的参数。向量非常适合。鉴于此,它可以计算内部数组中的索引,并返回对该特定元素的引用。
然后,您可以尝试处理各种resize
的痛苦。或者只是不保证保留任何数据的大小。