[英]How to overload subscript operator for multidimensional vectors?
這是我當前的Matrix類:
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,x)”函數時,“ cout << m [2] [4] [10] ”返回0而不是42。對我來說這沒有意義,我真的很想使用下標設置值。
編輯 :我更改了問題標題,使它更有意義。
operator [] (int index) { return ; }
這里的返回類型指定一個返回按值的函數。 因此,將返回matrix[index]
的副本,並且對返回值執行的任何后續操作只會影響副本,而不會影響原始對象。
解決方案總是返回一個左值引用。 但這仍然無濟於事,因為您如何返回索引。 Row(...)
構造一個Row
的臨時實例,該實例與您應返回的Row
對象是分開的-實際上是它的副本。 無需使用此語法,直接使用return:
operator [] (int index) { return ; }
請注意,這不僅適用於此函數,還適用於返回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]); }
我不想使用指針來避免內存溢出,這是我最初的解決方案,可能是一個糟糕的解決方案。 我認為這應該是一個很好的下標重載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.