Russian Qt Forum

Qt => Общие вопросы => Тема начата: itan от Январь 30, 2007, 10:15



Название: QVector< QVector<T> > перегрузка [][]
Отправлено: itan от Январь 30, 2007, 10:15
Использую примерно такой класс для работы с матрицами:
Код:
template <class T>
class CSimpleTableT
{
typedef QVector< QVector<T> > Matrix;
public:
CSimpleTableT(int row, int col);
....
private:
Matrix m_matrix;
};

Вопрос в слудующем: как мне перегрузить оператор [][] для работы с этим классом, чтобы записывать значения в матрицу через указание строки и столбца. Типа так:
Код:
CSimpleTableT<double> matrixDouble(3,3);
matrixDouble[0][0] = 1.5;
matrixDouble[0][1] = 2.5;
...


Название: QVector< QVector<T> > перегрузка [][]
Отправлено: Dendy от Январь 30, 2007, 11:08
А чем не вариант:

Код:
matrixDouble.value( 0, 0 ) = 1.5; 
matrixDouble.value( 0, 1 ) = 2.5;


ИМХО так понятнее за счёт того, что сохраняется стиль обращения к данньІм через ацессорьІ.

Вообще использовать массив массивов нееффективно с точки зрения скорости работьІ и памяти. Гораздо проще хранить один вектор, значения строк (столбцов) в котором рассположеньІ последовательно. Могу привести код.


Название: QVector< QVector<T> > перегрузка [][]
Отправлено: Вудруф от Январь 30, 2007, 11:22
Это уже Си++, а не Qt.
Определить в этом классе оператор [], возвращающий ссылку (или константную ссылку - для константных функций) на QVector<T>.
Код:

QVector & operator [] (unsigned int i)
{
    return m_matrix[i];
}

В таком случае всё так и будет работать, т.к. второй оператор [] будет применяться уже к QVector

добавлено спустя 2 минуты:

 
Цитировать
Гораздо проще хранить один вектор, значения строк (столбцов) в котором расположены последовательно.

Зависит от задачи, в некоторых вычислительных задачах быстрее будет хранить именно так, или даже массив указателей.
Скажем, в вычислении определителя, где придётся менять строки местами.


Название: QVector< QVector<T> > перегрузка [][]
Отправлено: itan от Январь 30, 2007, 11:26
Цитата: "Dendy"
А чем не вариант:

Код:
matrixDouble.value( 0, 0 ) = 1.5; 
matrixDouble.value( 0, 1 ) = 2.5;


ИМХО так понятнее за счёт того, что сохраняется стиль обращения к данньІм через ацессорьІ.

Вообще использовать массив массивов нееффективно с точки зрения скорости работьІ и памяти. Гораздо проще хранить один вектор, значения строк (столбцов) в котором рассположеньІ последовательно. Могу привести код.

Было бы интересно посмотреть...


Название: QVector< QVector<T> > перегрузка [][]
Отправлено: Alex03 от Январь 30, 2007, 15:29
nVectorSize = nRows * nCols;
nIdx = nRow * nCols + nCol;
+ Контроль выхода за границы


Название: QVector< QVector<T> > перегрузка [][]
Отправлено: Вудруф от Январь 30, 2007, 15:59
Если уж на то пошло, то можно и blaz-срезы использовать :) В случае, если нужны агрессивные вычисления.