Russian Qt Forum

Qt => Общие вопросы => Тема начата: Aleksey_Zh от Октябрь 28, 2009, 10:06



Название: Массивы переменной длины.
Отправлено: Aleksey_Zh от Октябрь 28, 2009, 10:06
Перед тем как перебраться на Qt я долгое время программировал на Delphi. Там есть очень полезная и интересная вещь - массивы переменной длины. Всегда можно добавить или удалить элемент из массива. Есть ли что-нибудь аналогичное в Qt? Кто знает - подскажите


Название: Re: Массивы переменной длины.
Отправлено: zenden от Октябрь 28, 2009, 10:19
http://doc.trolltech.com/4.5/qvector.html


Название: Re: Массивы переменной длины.
Отправлено: Aleksey_Zh от Октябрь 28, 2009, 10:30
Посмотрел. Если ничего не путаю - это одномерный массив, а с многомерностью что - нибудь есть?


Название: Re: Массивы переменной длины.
Отправлено: set от Октябрь 28, 2009, 10:55
нет... как в паскале тут не прокатит...

стандартными средствами можно только размерность массива задать переменной (ито в случае многомерного массива только послежнюю расзмерность)...

а вот нестандартным можно...  в сети есть куча библиотек - подключай и пользуйся...

нативные массивы быстрее - самодельные и STL'евские удобнее..

вобще конкретно для си, массив, это всегда строка со списком адресов элементов. Даже если ты работаеш с многомерным массивом - ты работаеш со строкой просто позиция элемента a[i,j] массива a[N,M] (грубо говоря) вычисляется как a[i*N+j]... делайте выводы...


Название: Re: Массивы переменной длины.
Отправлено: Aleksey_Zh от Октябрь 28, 2009, 11:02
Спасибо. Быстродействие не критично. Можно немного поподробнее - что за нативные массивы и что за STL?


Название: Re: Массивы переменной длины.
Отправлено: whirlwind от Октябрь 28, 2009, 11:39
Посмотрел. Если ничего не путаю - это одномерный массив, а с многомерностью что - нибудь есть?
как-то вроде
Код:
    QList< QList<int> > ttt;
    int ti = ttt[2][3];


Название: Re: Массивы переменной длины.
Отправлено: set от Октябрь 28, 2009, 12:52
Можно немного поподробнее - что за нативные массивы и что за STL?
http://cplus.h1.ru/cplus/bookc/bookc/book010.htm
http://www.sgi.com/tech/stl/


Название: Re: Массивы переменной длины.
Отправлено: Norgat от Октябрь 28, 2009, 21:20
вобще конкретно для си, массив, это всегда строка со списком адресов элементов. Даже если ты работаеш с многомерным массивом - ты работаеш со строкой просто позиция элемента a[i,j] массива a[N,M] (грубо говоря) вычисляется как a[i*N+j]... делайте выводы...

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

поэтому с точки зрения синтаксиса:

Код:
int a[n][k];
...

a[i*n + j];

правильно, но с точки зрения адресации в памяти, нет.


Название: Re: Массивы переменной длины.
Отправлено: Igors от Октябрь 29, 2009, 10:49
Ну особо страдать из-за "отсутствия 2-х мерного массива" не приходится - это легко решается операторами

Код:
template <class T>
struct MyArray {
  MyBitmap( int rows, int cols ) : mRows(rows), mCols(cols) { mData.reserve(mRows * mCols); }

  T & at( int row, int col ) { return mData[row * mCols + col];
  const T & at( int row, int col ) const { return mData[row * mCols + col]; }

// data members
  int mRows, mCols;
  QVector <T> mData;
};


Название: Re: Массивы переменной длины.
Отправлено: Winstrol от Октябрь 29, 2009, 14:25
Ну особо страдать из-за "отсутствия 2-х мерного массива" не приходится - это легко решается операторами
Код:
 mData.reserve(mRows * mCols);
resize.
Если у типов присутсвует деструктор, то он не вызовется для элементов при разрушении массива.


Название: Re: Массивы переменной длины.
Отправлено: Igors от Октябрь 29, 2009, 14:41
Ну особо страдать из-за "отсутствия 2-х мерного массива" не приходится - это легко решается операторами
Код:
 mData.reserve(mRows * mCols);
resize.
Если у типов присутсвует деструктор, то он не вызовется для элементов при разрушении массива.
Ну то дело хозяйское как строить конструктор и нужно ли торопиться с инициализацией всего массива. С reserve деструкторы не позовутся но и конструкторов не будет. Заметим также что несложно добавить удаление строк/столбцов с сохранением остальных данных