2017-04-16 59 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