一定要使用向量的向量吗?
如果不是,那么您可能可以在普通的行*列元素向量上实现一个包装器。
类似于:
class Vector
{
public:
int operator[]( int index )
{
return 1;
}
friend class Wrapper;
private:
Vector( std::vector<int> & vector, int index, int numElements );
std::vector<int> v_;
int index_;
int numElements_;
};
class Wrapper
{
public:
Vector operator[](int index)
{
return Vector( v_, index, numColumns_ );
}
Wrapper( int numRows, int numColumns);
void setNumRows( int numRows );
void setNumColumns( int numColumns );
private:
std::vector<int> v_;
int numRows_;
int numColumns_;
};
以及在主函数中:
Wrapper w;
int i = w[1][1];
编辑:
向量类将表示行或列数据。它需要作为参数传递线性化矩阵、矩阵几何(行数和列数)以及它所代表的行/列。
请用纸笔尝试以下操作:
1. 以矩阵形式写出3x4矩阵的元素
11 12 13 14
21 22 23 24
31 32 33 34
- 将它们以线性化方式写出:
11 12 13 14 21 22 23 24 31 32 33 34
一个元素在矩阵形式中的索引和它在线性化形式中的索引之间存在简单的关系,这取决于矩阵几何。
- 如果您想让向量“包含”元素21 22 23 24(或12 22 32),那么您需要在operator [](int index)中实现一些逻辑,以确定从Vector[index]获取的元素在底层向量中的索引。
假设您的向量需要引用矩阵的第二列(即12 22 32)。
那么:
- 向量中的第一项(即Vector [1])是线性化矩阵中的第二个元素
- 向量中的第二项22是基础向量中的第6个元素
- 向量中的第三项32是v_的第10个元素
现在,用铅笔和纸做同样的事情,针对矩阵的第三列(元素13 23 33)。
看看您是否发现第二列的基础向量中的索引(分别为2、6和10)与您找到的第三列的索引之间存在任何相似之处。