如何在C ++中定义双向量向量的向量?

时间:2014-09-12 12:49:06

标签: c++ vector

我知道我可以或应该使用3d数组,但如果我想用矢量,我该怎么办?

我知道如何使用向量向量来完成它,但我无法获得正确的泛化语法。

应该可以。

编辑:

我实际上是自己想出来的:

vector< vector< vector<double> > > the_vector(SIZE1, vector< vector<double>> (SIZE2,vector<double>(SIZE3,0)));

用于SIZE1 x SIZE2 x SIZE3载体

谢谢。

2 个答案:

答案 0 :(得分:4)

你可以做到

std::vector<std::vector<std::vector<double>>> v;

如果要在编译时概括维数,可以创建递归模板:

template<int n, typename T>
struct nvect;

template<typename T>
struct nvect<1, T> {
    std::vector<T> data;
};

template<int n, typename T>
struct nvect {
    std::vector<nvect<n-1, T> > data;
};

用于例如

nvect<3, double> x;

使用C ++ 11和可变参数模板,您还可以轻松创建一个具有您要求的一些属性的n维固定矩阵:

template<typename T, int ...rest>
struct matrix;

template<typename T, int n>
struct matrix<T, n> {
    T data[n];
    matrix() {
        for (int i=0; i<n; i++) {
            data[i] = T(0);
        }
    }
    T& operator[](int index) { return data[index]; }
};

template<typename T, int n, int ...rest>
struct matrix<T, n, rest...> {
    matrix<T, rest...> data[n];
    matrix<T, rest...>& operator[](int index) { return data[index]; }
};

template<typename T, int n, int ...rest>
matrix<T, rest...> *begin(matrix<T, n, rest...>& x) { return &x.data[0]; }

template<typename T, int n, int ...rest>
matrix<T, rest...> *end(matrix<T, n, rest...>& x) { return &x.data[n]; }

template<typename T, int n>
T *begin(matrix<T, n>& x) { return &x.data[0]; }

template<typename T, int n>
T *end(matrix<T, n>& x) { return &x.data[n]; }

这可以用作

int main() {
    matrix<double, 10, 10> m;
    for (int i=0; i<10; i++) {
        m[i][i] = 1.0;
    }

    for (auto& row : m) {
        for (auto& cell : row) {
            std::cout << cell << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

答案 1 :(得分:0)

你可以试试这个:

std::vector<std::vector<std::vector<double>>>

但我不确定你在找什么?