c++ - 根据输入的动态二维数组

标签 c++ vector matrix multidimensional-array

我需要从用户那里得到一个输入 N 并生成一个 N*N 矩阵。如何声明矩阵?一般来说,数组和矩阵的大小应该在声明的时候固定,对吧? 怎么样vector<vector<int>> ?我以前从未使用过它,所以我需要资深人士的建议。

最佳答案

A vector<vector<int>> (或 vector<vector<int> >,对于较旧的编译器)可以很好地工作,但它不一定是最有效的处理方式1。另一个可以很好地工作的是围绕单个 vector 的包装器,它跟踪所表示的矩阵的“形状”,并提供一个函数或重载运算符来访问数据:

template <class T>
class matrix { 
    int columns_;
    std::vector<T> data;
public:
    matrix(int columns, int rows) : columns_(columns), data(columns*rows) {}

    T &operator()(int column, int row) { return data[row*columns_+column]; }
};

请注意,C++ 标准只允许 operator[]接受一个操作数,所以你不能将它用于这项工作,至少不能直接使用。在上面的例子中,我(显然)使用了 operator()相反,因此下标看起来比您在 C++ 中习惯的更像 Fortran 或 BASIC。如果您真的打算使用 []符号,你无论如何都可以这样做,虽然它有点棘手(你在矩阵类中重载它以返回一个代理,然后让代理类也重载 operator[] 以返回(引用)正确的元素 - 它有点难看在内部,但无论如何都能很好地工作)。

这是一个如何使用 operator[] 的多个重载来实现版本的示例.在大多数编译器包含 std::vector 之前,我写了这篇文章(很长一段时间) ,所以它静态分配一个数组而不是使用 vector 。它也适用于 3D 情况(因此涉及两个级别的代理),但幸运的是,基本思想还是通过了:

template<class T, int size>
class matrix3 {

    T data[size][size][size];

    friend class proxy;
    friend class proxy2;

    class proxy { 
        matrix3 &m_;
        int index1_, index2_;
    public:
        proxy(matrix3 &m, int i1, int i2) 
            : m_(m), index1_(i1), index2_(i2) 
        {}

        T &operator[](int index3) { 
            return m_.data[index1_][index2_][index3];
        }
    };

    class proxy2 { 
        matrix3 &m_;
        int index_;
    public:
        proxy2(matrix3 &m, int d) : m_(m), index_(d) { }

        proxy operator[](int index2) { 
            return proxy(m_, index_, index2);
        }
    };
public:
    proxy2 operator[](int index) {
        return proxy2(*this, index);
    }
};

使用它,您可以使用普通的 C++ 语法对矩阵进行寻址,例如:

matrix3<double, size> m;

for (int x=0; x<size; x++)
    for (int y = 0; y<size; y++)
        for (int z = 0; z<size; z++)
            m[x][y][z] = x*100 + y * 10 + z;

  1. std::vector通常实现为指向一些动态分配数据的指针,所以类似于 vector<vector<vector<int>>>将取消引用两级指针以获取每条数据。这意味着更多的内存引用,这在大多数现代处理器上往往相当慢。由于每个 vector 都包含单独分配的数据,因此通常也会导致缓存局部性差。它还会浪费一些空间,因为每个 vector 都存储其分配的大小和使用中的大小。

关于c++ - 根据输入的动态二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2216017/

相关文章:

c++ - 如何从字符串 vector 中选择第n个位置?

java - 出现编译错误: int[][] cannot be converted to int Java [closed]

algorithm - LUP - bool 矩阵的分解 : any pointers

c++ - 这是 Klocwork 的误报吗

c++ - 插件的初始化程序问题。一个测试

c++ - 警告 : '0' flag used with '%p' gnu_printf format

c++ - 可变参数模板和 C 数组

matrix - 深度学习模型中不同数量节点的直觉

c++ - 遍历指针 vector

r - 计算 R 中矩阵的永久值