我有一个矩阵,我如何get_row()
按行引用?get_column
按列参考?
其中一个我不能通过引用得到(我尝试通过行主ordering
和列主ordering
但它没有解决这个问题,因为我需要通过引用得到两个)。如何重新定义(覆盖)vector
来解决此问题?
谢谢!
答案 0 :(得分:2)
首先,不要忽视所有要求您发布课程代码的人。
那就是说,你可以做的是定义一些与行或列的迭代器相当的东西。不是你实际要求的,但由于行和列的内存不能连续,所以无论如何都需要一个自定义类型。
这是一个示例布局,当然省略了很多东西。我没有太多考虑过它,可能很容易就是有更好的模式。我将矩阵类创建为一个超过double的类,很可能你会使用模板。
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++)
)
同样,可能有更好的模式,不确定。对于比我更了解这一点的人的编辑会很高兴。
另外,当然这可以简单地通过用矩阵和所需的行提供东西来完成,并让它简单地遍历列本身 - 因此我不确定发布这个答案。取决于你想做什么以及有机逻辑是什么 - 除了你的矩阵代码之外,你还会建议你清楚地描述你想对这些参考做些什么。
答案 1 :(得分: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方法创建。