如何重载多维向量的下标运算符
How to overload subscript operator for multidimensional vectors?
这是我当前的矩阵类:
template<class T>
class Matrix
{
public:
Matrix() { }
Matrix(int z, int x, int y)
{
matrix.resize(z);
for (unsigned int i = 0; i < matrix.size(); i++)
matrix[i].resize(x);
for (unsigned int i = 0; i < matrix.size(); i++)
{
for (unsigned int j = 0; j < matrix[i].size(); j++)
matrix[i][j].resize(y);
}
Fill(0);
}
int dim1() { return matrix.size(); }
int dim2() { return matrix[0].size(); }
int dim3() { return matrix[0][0].size(); }
void Fill(int n);
bool Set(int z, int x, int y, T value);
class Row
{
std::vector<std::vector<T>> m_row;
public:
Row(std::vector<std::vector<T>> row) : m_row(row) { }
class Column
{
std::vector<T> m_column;
public:
Column(std::vector<T> column) : m_column(column) { }
T& operator [] (int index) { return this->m_column[index]; }
};
Column operator [] (int index) { return Column(m_row[index]); }
};
Row operator [] (int index) { return Row(matrix[index]); }
private:
std::vector<std::vector<std::vector<T>>> matrix;
};
template<class T>
void Matrix<T>::Fill(int n)
{
for (unsigned int i = 0; i < matrix.size(); i++)
for (unsigned int j = 0; j < matrix[0].size(); j++)
for (unsigned int k = 0; k < matrix[0][0].size(); k++)
matrix[i][j][k] = n;
}
template<class T>
bool Matrix<T>::Set(int z, int x, int y, T value)
{
if (z < matrix.size() && x < matrix[0].size() && y < matrix[0][0].size())
{
matrix[z][x][y] = value;
return true;
}
else
return false;
}
一切正常,除了下面代码中注释掉的一行
Matrix<int> m(3, 10, 20);
m.Set(2, 4, 10, 42);
// m[2][4][10] = 42;
std::cout << "base layer: " << m.dim1() << std::endl;
std::cout << "layer x: " << m.dim2() << std::endl;
std::cout << "layer y: " << m.dim3() << std::endl;
std::cout << "nm[2][4][10] = " << m[2][4][10] << std::endl;
当我执行"m[2][4][10]=42"时,而不是"Set(x,x,x)"函数,"cout<<m[2][4][10]"返回0而不是42。这对我来说毫无意义,我真的很想用下标来设置值。
编辑:我更改了问题标题以使其更有意义。
Row operator [] (int index) { return Row(matrix[index]); }
这里的返回类型指定一个函数,该函数通过值返回。因此,返回matrix[index]
的副本,并且对返回值执行的任何后续操作都只影响副本,而不会影响原始对象。
解决方案总是返回一个左值引用。但这仍然没有帮助,因为如何返回索引。Row(...)
构造了Row
的临时实例,它与您应该返回的Row
对象是分开的-它实际上是它的副本。不需要使用此语法,直接使用return:
Row& operator [] (int index) { return matrix[index]; }
请注意,这不仅适用于此函数,也适用于返回Column
的函数。
我今天再次查看了我的代码,并意识到我所需要的只是双向引用。因此,我将Row和Column变量更改为引用,并对其进行了测试,结果成功了。
class Row
{
std::vector<std::vector<T>>& m_row;
public:
Row(std::vector<std::vector<T>>& row) : m_row(row) { }
class Column
{
std::vector<T>& m_column;
public:
Column(std::vector<T>& column) : m_column(column) { }
T& operator [] (int index) { return this->m_column[index]; }
};
Column operator [] (int index) { return Column(m_row[index]); }
};
Row operator [] (int index) { return Row(matrix[index]); }
我不想使用指针来避免内存泄漏,这是我最初的解决方案,可能也是一个糟糕的解决方案。我认为这应该是一个很好的下标重载。
相关文章:
- 尝试通过多个向量访问变量时,向量下标超出范围
- c++下标运算符到下级类向量
- 创建结构体向量,表达式:向量下标超出范围
- 向量下标超出向量向量的范围
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- 行进立方体重建 - 向量下标超出范围
- 为什么简单的C++向量函数会产生越界的下标
- C 向量下标超出范围,没有逻辑错误,无法弄清楚
- C 表达式:向量下标出范围错误线:1733
- 对的向量无效的向量<T>下标
- OPENCV图像处理,向量下标超出范围
- 尝试加载DirectX 11中的obj文件时,向量下标
- 向量下标超出范围-类构造函数初始化中的2D向量
- 向量下标超出范围-气泡排序-改进
- 向量下标超出范围的多维向量
- 具有基类向量的类的下标运算符重载,该向量必须返回派生类
- 使用向量和指针的双下标重载的区别
- SDL向量下标超出范围
- 重载向量下标运算符以获取字符*或字符串
- 向量下标超出范围- c++