我需要使用矩阵,我正在使用这种声明,例如对于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;
?如何实现这样的功能?
答案 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]; }