2017-04-16 32 views
-1

通过引用get_column我有一个矩阵,并且我get_row()通过行参考并且get_column通过柱参考如何?get_row和基质在C++

其中一个我不能通过参考获得(我通过行主ordering和列主要ordering尝试,但它没有解决这个问题,因为我需要通过参考)。我如何重新定义(覆盖)vector来解决这个问题?

谢谢!

+1

一些代码,可以帮助解决这个:) –

+2

忽略,这是一个不好的问题,你不能两者兼得。根据您是使用列还是行 - 主要,您可以按引用或按引用逐列。 –

+1

第1步是发布您的矩阵的代码。 –

回答

1

首先,不要忽略所有要求你来发表您的类的代码谁的人。

这就是说,你可以做的就是定义一些作品相当一个迭代器WRT一行或一列。不是你实际要求的内容,但是由于行和列的内存不能连续,所以无论如何你都需要一个自定义类型。

这是一个布局示例,当然省略了很多东西。我还没有深入思考,可能很容易就会有更好的模式。我创建矩阵类作为一个超过双重的类,很可能你会使用模板。

class Matrix{ 

    class RowIterator; 

    friend class RowIterator; 

    private: 
     vector<vector<double> > data; 

    public: 

     RowIterator row_iterator(const unsigned int row); 

    } 

class Matrix::RowIterator{ 

    private: 
     Matrix* parent; 
     unsigned int row; 
     unsigned int col; 

    public: 

     double& operator *(); 
     RowIterator& operator++() 
     bool equals(const unsigned int column) const; 
} 

double& Matrix::RowIterator::operator *(){ 
    return parent->data[row][col]; 
} 
Matrix::RowIterator& Matrix::RowIterator::operator++(){ 
    col++; 
    return *this; 
} 
bool equals(const unsigned int column) const{ 
    return column == col; 
} 

和ColumnIterator同样(或两者为一个类存储和它是什么附加部件),也可以定义

inline bool operator==(const Matrix::RowIterator& lhs, const unsigned int rhs){ 
    return lhs.equals(rhs) 
} 

并且同样周围的其他方法和!= - 运营商

能够做这样的代码

for(Matrix::RowIterator it = matrix.row_iterator(desired_row); it != matrix.columns(); it++) 

再次(或者用东西导致

for(Matrix::RowIterator it = matrix.row_iterator(desired_row); it.at_valid_position(); it++) 

去),有可能是一个更好的方式的模式,不知道这一点。对编辑知道这个比我更好的人会感到高兴。

而且,当然,这可以简单地通过将与基体和该行的东西,而不是具有它只是在塔本身迭代完成 - 因此我不知道张贴这个答案。取决于你想要做什么以及有机逻辑是什么 - 会建议除了矩阵的代码之外,你还可以清楚地描述你想要用这些参考做什么。

+0

非常感谢你的帮助Aziuth – Lilia

+0

@Lilit(Psst:如果它真的解决了你的问题,你[接受了答案](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) - 当然,如果它确实的话。虽然不确定,但还是不要在这种情况下,请详细说明您的问题,我会很乐意提供帮助。) – Aziuth

+0

实际上,我还希望看到其他解决方案 – Lilia

0

另一种方法,更载体,如:

enum MatrixSubVectorType{ row_vector, column_vector }; 

class MatrixSubVector{ 

private: 

    MatrixSubVectorType type; 
    unsigned int fixed_coordinate; 
    Matrix* parent; 

public: 

    double& operator[] (unsigned int i); 
    const double& operator [] (unsigned int i); 

    unsigned int size() const; 
} 

double& MatrixSubVector::operator[] (unsigned int i) { 

    if(type == row_vector){ 
     return (*parent)(fixed_coordinate, i); 
    } 
    return (*parent)(i, fixed_coordinate); 
} 

unsigned int MatrixSubVector::size() const { 

    if(type == row_vector){ 
     return parent->columns(); 
    } 
    return parent->rows() 
} 

有了很多的东西省略,当然,像构造,只是为了显示模式。与其他模式一样,我将它作为Matrix的内部类,将Matrix作为朋友,构造函数是私有的,并且该类的对象只能由Matrix的方法创建。

+0

正如我前面提到的,我想通过引用获得列和行,两者都是 – Lilia

+0

类似这样的: column&get_column(size_type column_index) { return m_columns [column_index]; } row&get_row(size_type row_index) { return m_data [row_index]; } – Lilia

+0

@Lilia重要的问题是你想用它做什么。再次,请回答这个问题:“你想要对提取的向量做什么?对它们进行迭代?写下它们?流出它们?” - 这里是重要的事情。其他一切都是XY-问题。不是“我想要这个”,而是“为了......”。再加上重要的内容 - 例如,如果内存不重要,您可以简单地使用一个矩阵类,该矩阵类还可以存储包含数据指针的附加向量。根据参考文献的性质,您需要使用类似于此的签名。 – Aziuth