创建尺寸尺寸可变的c ++向量

时间:2020-04-26 16:40:09

标签: c++

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

我在这里发现了一些主题相同的话题,但没有像Create n-dimensional vector with given sizesC++: 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'变量

1 个答案:

答案 0 :(得分:2)

实际上,它比编译时解决方案更简单。

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

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

然后,您可以尝试处理各种resize的痛苦。或者只是不保证保留任何数据的大小。