Russian Qt Forum

Qt => Общие вопросы => Тема начата: danius от Март 08, 2006, 22:15



Название: Матрица из QVector
Отправлено: danius от Март 08, 2006, 22:15
Извиняйте если уже где-то звучало. При пользовании STL был примерно такой фрагмент:
в определении класса:
Код:
vector<vector<int> > ground;

в конструкторе:
Код:
ground.assign(nrow, ncol);


Как бы можно было получить матрицу из вектора с помощью QTL. Вопрос в том, что метода QVector::assign в QTL нет, можно попробовать resize, но выходит довольно громоздко (у меня :( ). Может кто уже сталкивался с подобным. Спасибо.


Название: Матрица из QVector
Отправлено: Steven_Orko от Март 08, 2006, 23:19
А почему не хочешь использовать MTL(The Matrix Template Library)???
http://www.osl.iu.edu/research/mtl/

Там есть много функций для работы с матрицами )))


Название: Матрица из QVector
Отправлено: danius от Март 09, 2006, 10:16
Цитата: "Steven_Orko"

Там есть много функций для работы с матрицами )))


Да, очень много  :shock: у меня в программе всего две матрицы размером не более 30x40 не очень хотелось бы таскать ради этого с собой такую библиотеку. Хотя вещь стоящая, не знал о ней.

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

 Вот нашел еще одну библиотеку libkdegames (из пакета kdegames), есть там файл kgrid2d.h в котором определен шаблонный класс Generic для 'двухмерной сетки', но и там они матрицу раскладывают в вектор по строкам (правда довольно прозрачно это делают). Так что вопрос остается открытым.


Название: Матрица из QVector
Отправлено: Dendy от Март 09, 2006, 10:18
Qt используют единьІй стиль работьІ с векторами, чтобьІ не возникало путаницьІ, поетому вектор всегда одномерньІй. Но могу предложить такой способ для работьІ с массивами:

Код:
QVector< QVector<int> > matrix = QVector< QVector<int> >( 30, QVector<int>( 40 ) );


или

Код:
matrix = QVector< QVector<int> >( 30, QVector<int>( 40, 7 ) ); // 7 - default value, matrix filled with


или

Код:
matrix.resize( 30 );
matrix.fill( QVector<int>( 40 ) );


Громоздкий конструктор, но работа с такой матрицей как с обьІчной:

Код:
matrix[3][5] = 123;
...
int value = matrix[6][2];


Кстати, одно из нововведений в новом стандарте С++, которьІй предложил Страуструп - обращение к шаблонньІм классам без повторного указания типа.


Название: Матрица из QVector
Отправлено: danius от Март 09, 2006, 12:40
У меня было:
Код:
template <class T>
void initMatrix(QVector<QVector<T> > &matrix, int nrow, int ncol, T value)
{
    matrix.resize(nrow);
for(int i = 0; i != nrow; ++i)
matrix[i].resize(ncol);

for(int i = 0; i != nrow; ++i)
for(int j = 0; j != ncol; ++j) matrix[i][j] = value;
}

Но у Dendy гораздо элегантнее  :D . Спасибо за помощь


Название: Матрица из QVector
Отправлено: SLiDER от Март 09, 2006, 13:06
Цитата: "Steven_Orko"
А почему не хочешь использовать MTL(The Matrix Template Library)???
http://www.osl.iu.edu/research/mtl/

Там есть много функций для работы с матрицами )))


Немного оффтопика.  :)  Может кто не знает !!!  :shock:  Осмелюсь предложить, всем кто пишет числодробилки, посмотреть в сторону библиотеки Blitz++ (http://oonumerics.org/blitz), не пожалеете. Очень хороший пример того как надо писать на С++.  :wink: