Название: QVector< QVector<T> > перегрузка [][] Отправлено: itan от Январь 30, 2007, 10:15 Использую примерно такой класс для работы с матрицами:
Код: template <class T> Вопрос в слудующем: как мне перегрузить оператор [][] для работы с этим классом, чтобы записывать значения в матрицу через указание строки и столбца. Типа так: Код: CSimpleTableT<double> matrixDouble(3,3); Название: QVector< QVector<T> > перегрузка [][] Отправлено: Dendy от Январь 30, 2007, 11:08 А чем не вариант:
Код: matrixDouble.value( 0, 0 ) = 1.5; ИМХО так понятнее за счёт того, что сохраняется стиль обращения к данньІм через ацессорьІ. Вообще использовать массив массивов нееффективно с точки зрения скорости работьІ и памяти. Гораздо проще хранить один вектор, значения строк (столбцов) в котором рассположеньІ последовательно. Могу привести код. Название: QVector< QVector<T> > перегрузка [][] Отправлено: Вудруф от Январь 30, 2007, 11:22 Это уже Си++, а не Qt.
Определить в этом классе оператор [], возвращающий ссылку (или константную ссылку - для константных функций) на QVector<T>. Код:
В таком случае всё так и будет работать, т.к. второй оператор [] будет применяться уже к QVector добавлено спустя 2 минуты: Цитировать Гораздо проще хранить один вектор, значения строк (столбцов) в котором расположены последовательно. Зависит от задачи, в некоторых вычислительных задачах быстрее будет хранить именно так, или даже массив указателей. Скажем, в вычислении определителя, где придётся менять строки местами. Название: QVector< QVector<T> > перегрузка [][] Отправлено: itan от Январь 30, 2007, 11:26 Цитата: "Dendy" А чем не вариант: Код: matrixDouble.value( 0, 0 ) = 1.5; ИМХО так понятнее за счёт того, что сохраняется стиль обращения к данньІм через ацессорьІ. Вообще использовать массив массивов нееффективно с точки зрения скорости работьІ и памяти. Гораздо проще хранить один вектор, значения строк (столбцов) в котором рассположеньІ последовательно. Могу привести код. Было бы интересно посмотреть... Название: QVector< QVector<T> > перегрузка [][] Отправлено: Alex03 от Январь 30, 2007, 15:29 nVectorSize = nRows * nCols;
nIdx = nRow * nCols + nCol; + Контроль выхода за границы Название: QVector< QVector<T> > перегрузка [][] Отправлено: Вудруф от Январь 30, 2007, 15:59 Если уж на то пошло, то можно и blaz-срезы использовать :) В случае, если нужны агрессивные вычисления.
|