Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Roninsc2 от Декабрь 31, 2014, 22:12



Название: Работа с двумерным массивом QVector
Отправлено: Roninsc2 от Декабрь 31, 2014, 22:12
Добрый вечер! Всех с наступающим Новым Годом))

Собственно вопрос: мне надо создать двумерный массив интов.
Как я понимаю, это делается так:

QVector< QVector<int> > array;

Вопрос, как задать его размер? И как проводить с ним операции присваивания и изменения?
Скажем, мы идем 2-мя циклами. И изменяем массив с помощью at().
Т.е.:

for(int i = 0; i < 10; i++)
{
       for(int j = 0; j < 10; j++)
       {
               array.at(??) = 0;
       }
}

Или же.

int * data = array.data();

for(int i = 0; i < 10; i++)
{
       for(int j = 0; j < 10; j++)
       {
              data[?][?] = 0;
       }
}

Вот как-то так
Буду благодарен за помощь.


Название: Re: Работа с двумерным массивом QVector
Отправлено: alex312 от Январь 01, 2015, 12:35
http://www.prog.org.ru/topic_27860_0.html


Название: Re: Работа с двумерным массивом QVector
Отправлено: Roninsc2 от Январь 01, 2015, 18:57
Благодарю!


Название: Re: Работа с двумерным массивом QVector
Отправлено: m_ax от Январь 01, 2015, 20:28
Благодарю!

Я бы не стал так всерьёз относиться к тем "статьям" 8Observer8а.. Особенно по части двумерных массивов.. (это, скорее, пример того, как делать не стоит..)


Название: Re: Работа с двумерным массивом QVector
Отправлено: Hrundel от Январь 01, 2015, 21:27
Благодарю!

Я бы не стал так всерьёз относиться к тем "статьям" 8Observer8а.. Особенно по части двумерных массивов.. (это, скорее, пример того, как делать не стоит..)

Поддерживаю.


Название: Re: Работа с двумерным массивом QVector
Отправлено: Igors от Январь 02, 2015, 10:59
QVector< QVector<int> > array;
...
               array.at(??) = 0;
...
              data[?][?] = 0;
Лучше
Код
C++ (Qt)
QList < QVector<int> > array;
 
А обращение к эл-ту - просто
Код
C++ (Qt)
array[i][j]
т.е. как к обычному массиву.


Название: Re: Работа с двумерным массивом QVector
Отправлено: Авварон от Январь 02, 2015, 22:50
QList не лучше, сейчас тренд отказываться от него


Название: Re: Работа с двумерным массивом QVector
Отправлено: Igors от Январь 03, 2015, 08:43
QList не лучше, сейчас тренд отказываться от него
Мотивация впечатляет: "потому что так говорят" :) Укажите первоисточник please. И кстати - а чем плох "вектор векторов"?


Название: Re: Работа с двумерным массивом QVector
Отправлено: Авварон от Январь 03, 2015, 11:41
Вот огромная статья, сравнивающая стл и Qt контейнеры. Минусы QList там описаны.
Вектор векторов ничем не плох, так как структура в памяти ничем не будет отличаться от той же в QList (размер вектора == sizeof(void *), он movable в терминологии Qt, следовательно, лист разместит сами вектора в ячейках массива)
А вот в Qt6 размер вектора может и поменяться - чтобы поддерживать векторные литералы (и не иметь оверхеда в виде фейкового ArrayData) надо data и size вынести из d_ptr. И тут QList будет уже давать оверхед по памяти.


Название: Re: Работа с двумерным массивом QVector
Отправлено: Igors от Январь 03, 2015, 15:49
Вот огромная статья, сравнивающая стл и Qt контейнеры. Минусы QList там описаны.
Где "вот"  ???

Вектор векторов ничем не плох, так как структура в памяти ничем не будет отличаться от той же в QList (размер вектора == sizeof(void *), он movable в терминологии Qt, следовательно, лист разместит сами вектора в ячейках массива)
А вот в Qt6 размер вектора может и поменяться - чтобы поддерживать векторные литералы (и не иметь оверхеда в виде фейкового ArrayData) надо data и size вынести из d_ptr. И тут QList будет уже давать оверхед по памяти.
Все это справедливо, но зачем вдаваться в этот анализ? При структуре данных "массив массивов" разумно потратить чуть больше памяти на эл-ты первого уровня, зато намного выиграть в скорости удаления/вставки. Поэтому достаточно знать что QList не перемещает данные имеющиxся эл-тов.

Когда программист на С без затей пишет
Код:
int ** array = ...
Он ведь выделяет память для каждой строки, и имеет возможность их удалять, переставлять и.т.п. не трогая все остальные. Впрочем для пишущих статьи это почему-то неочевидно  :)


Название: Re: Работа с двумерным массивом QVector
Отправлено: Авварон от Январь 03, 2015, 17:31
Вот огромная статья, сравнивающая стл и Qt контейнеры. Минусы QList там описаны.
Где "вот"  ???

Вектор векторов ничем не плох, так как структура в памяти ничем не будет отличаться от той же в QList (размер вектора == sizeof(void *), он movable в терминологии Qt, следовательно, лист разместит сами вектора в ячейках массива)
А вот в Qt6 размер вектора может и поменяться - чтобы поддерживать векторные литералы (и не иметь оверхеда в виде фейкового ArrayData) надо data и size вынести из d_ptr. И тут QList будет уже давать оверхед по памяти.
Все это справедливо, но зачем вдаваться в этот анализ? При структуре данных "массив массивов" разумно потратить чуть больше памяти на эл-ты первого уровня, зато намного выиграть в скорости удаления/вставки. Поэтому достаточно знать что QList не перемещает данные имеющиxся эл-тов.

Когда программист на С без затей пишет
Код:
int ** array = ...
Он ведь выделяет память для каждой строки, и имеет возможность их удалять, переставлять и.т.п. не трогая все остальные. Впрочем для пишущих статьи это почему-то неочевидно  :)

Да, ссылку-то я и не накопипастил:) http://marcmutz.wordpress.com/effective-qt/containers/
QVector тоже не перемещает данные, если они movable (если мне не изменяет память)

PS: еле отправил пост:( Что-то форум на отправку тупит