Russian Qt Forum
Октябрь 02, 2024, 07:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QVector< QVector<T> > перегрузка [][]  (Прочитано 5944 раз)
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;
...
Записан
Dendy
Гость
« Ответ #1 : Январь 30, 2007, 11:08 »

А чем не вариант:

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


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

Вообще использовать массив массивов нееффективно с точки зрения скорости работьІ и памяти. Гораздо проще хранить один вектор, значения строк (столбцов) в котором рассположеньІ последовательно. Могу привести код.
Записан
Вудруф
Гость
« Ответ #2 : Январь 30, 2007, 11:22 »

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

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

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

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

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

Зависит от задачи, в некоторых вычислительных задачах быстрее будет хранить именно так, или даже массив указателей.
Скажем, в вычислении определителя, где придётся менять строки местами.
Записан
itan
Гость
« Ответ #3 : Январь 30, 2007, 11:26 »

Цитата: "Dendy"
А чем не вариант:

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


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

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

Было бы интересно посмотреть...
Записан
Alex03
Гость
« Ответ #4 : Январь 30, 2007, 15:29 »

nVectorSize = nRows * nCols;
nIdx = nRow * nCols + nCol;
+ Контроль выхода за границы
Записан
Вудруф
Гость
« Ответ #5 : Январь 30, 2007, 15:59 »

Если уж на то пошло, то можно и blaz-срезы использовать Улыбающийся В случае, если нужны агрессивные вычисления.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.075 секунд. Запросов: 20.