Я наткнулся на блокпост с одним моим проектом. Я хочу создать матрицу верхнего треугольника (все элементы ниже диагонали равны нулю), которая выделяет только память, необходимую для хранения ненулевых элементов. У меня проблема с индексацией в эту матрицу. Я бы предпочел не переделывать матрицу, но если это единственное решение, то я могу его принять. В качестве примечания: Vector — это моя собственная реализация, а не вектор stl.
Пока у меня есть класс, объявленный следующим образом:
template <class T>
class UMatrix : public AbstractMatrix<T>
{
private:
Vector<T>* m_data;
int m_size;
public:
//lots of member functions
};
Конструктор матрицы верхнего треугольника:
template <class T>
UMatrix<T>(const int size)
{
m_size = size;
if(size < 1)
throw(RangeErr(size));
m_data = new Vector<T> [size];
for(int i = 0; i < size; i++)
{
Vector<T> init(i + 1);
m_data[i] = init;
}
}
И код, с которым у меня проблемы:
template <class T>
Vector<T>& operator[] (const int index)
{
if(m_data != NULL && index >= 0 && index < m_rows)
{
// Insert dark magic here
}
else
{
throw(RangeErr(index));
}
}
Это приводит к массиву расположенных в шахматном порядке векторов, каждый из которых на 1 больше предыдущего.
Я пытаюсь реализовать оператор скобки таким образом, чтобы UMatrix[a][b]
обращался к строке a, столбцу b истинной верхней треугольной матрицы. Это означает, что UMatrix[a][b] == 0
при a > b
.
Оператор скобок также является виртуальной функцией из абстрактного базового класса и должен возвращать вектор Vector&. Кроме того, эта реализация должна использовать оператор скобки, а не оператор function(), чтобы она была совместима с ранее написанным кодом. Я знаю, что было бы проще использовать плотную матрицу, но я ограничен только необходимым использованием памяти.
Моя первая попытка заключалась в использовании одного вектора для хранения, похожего на матрицу массива 1d. Однако оператор скобки, по-видимому, также невозможно написать для этой реализации.
Мой вопрос: возможно ли реализовать этот оператор скобок?
new Vector
обычно ошибается. Почему бы просто не иметь векторный объект? Чтобы сделать 2d оператор[]
, вы должны использовать прокси-объект. Проще добавитьoperator()
, который принимает любое количество параметров. - person Neil Kirk   schedule 01.04.2015