C ++ - 自定义矩阵结构

时间:2016-12-30 10:58:28

标签: c++

我需要使用矩阵,我正在使用这种声明,例如对于int数据类型:

std::vector < vector <int>> my2Dvec(rows, vector <int> (cols));

但是现在我想将它用于多种数据类型,所以我宣布了这个模板:

template <typename T>
struct matrix
{
    int col, row;
    std::vector <std::vector <T>> data;

    matrix(int c, int r) : col(c), row(r), data(col, std::vector <T> (row))
    {
        ;
    }
};

所以我可以像以下一样使用它:

matrix <int> m(10, 10);
...
m.data[1][2] = 0;

现在,我如何使用(如果可能):

m[i][j] = someValue;

?如何实现这样的功能?

3 个答案:

答案 0 :(得分:1)

您需要以一种方式实施operator[],以便它可以再次使用operator[]来获取结果。

示例代码:

struct matrix
{
    struct Proxy
    {
        std::vector<int>* vec;

        Proxy(std::vector<int>* vec_)
            : vec(vec_)
        {
        }

        int& operator[](int index)
        {
            return (*vec)[index];
        }
    };

    matrix(int c, int r) : col(c), row(r), data(c, std::vector<int>(r))
    {
    }

    Proxy operator[](int index)
    {
        return Proxy(&data[index]);
    }

    int col, row;
    std::vector<std::vector<int>> data;
};

答案 1 :(得分:1)

您只需要实现一个[]运算符,该运算符返回对行的引用:

std::vector<T> & operator[](int i) {
    return data[i];
}

由于operator []已在矢量上定义,这就足够了。

关于封装的一点。

这可以这样使用,因为它被声明为结构,具有公共实现,所以这里没有封装。如果matrix隐藏了它的实现(这是正常的C ++方式),那么您应该简单地声明一个实现Row<T>的{​​{1}}类型。这只不过是duck typing,即使它更多地用在像Python或Ruby这样的动态语言上,它甚至可以在C ++中提供帮助。

这是一个关于通过鸭子打字封装的例子:

operator []

答案 2 :(得分:0)

你必须实现array-subscript运算符:

int& operator[](std::size_t i) { return data[i]; }