Russian Qt Forum

Qt => Общие вопросы => Тема начата: JamS007 от Январь 01, 2010, 17:32



Название: Многоуровневая структуризация
Отправлено: JamS007 от Январь 01, 2010, 17:32
Здравствуйте,

по ходу написания своего проекта столкнулся с потребностью сохранять данные в структурированном виде. Количество элементов не известно заранее, и мало того, должно изменяться. Потому использовать буду какой-нибудь QVector<T> - подобный класс.

Подскажите, пожалуйста, как сделать множественное наследование (что-то типа массив массивов), но использовать при этом STL.
на пример:
Код:
char a[5][5]

QVector<QVector<T>> - явно не то...  :)

спасибо.



Название: Re: Многоуровневая структуризация
Отправлено: Makss от Январь 01, 2010, 18:09
QVector< QVector<T> > vec; - это оно и есть

vec[0][0] - ваше значение


Название: Re: Многоуровневая структуризация
Отправлено: JamS007 от Январь 01, 2010, 18:28
вот... не додумался, что из-за пробела может не работать... Спасибо!


Название: Re: Многоуровневая структуризация
Отправлено: lit-uriy от Январь 01, 2010, 18:29
>>вот... не додумался, что из-за пробела может не работать... Спасибо!
А это потому-что асиситент не прочитал, там об этом нюансе упомянуто.


Название: Re: Многоуровневая структуризация
Отправлено: ilot от Январь 02, 2010, 14:34
>>вот... не додумался, что из-за пробела может не работать... Спасибо!
А это потому-что асиситент не прочитал, там об этом нюансе упомянуто.
О каком пробеле, если не секрет, идет речь? и где это упомянуто в ассистенте?
QVector<QVector<T>> - явно не то...  :)
отлично работает...


Название: Re: Многоуровневая структуризация
Отправлено: BlackTass от Январь 02, 2010, 15:17
О каком пробеле, если не секрет, идет речь? и где это упомянуто в ассистенте?
Речь о пробеле между двумя закрывающими треугольными скобками. Не знаю где в ассистанте это описано (скорее всего в описании кутешных контейнеров может такое быть), но вообще это указано и в стандарте и у Страуструпа при описании синтаксиса шаблонов.


Название: Re: Многоуровневая структуризация
Отправлено: lit-uriy от Январь 02, 2010, 18:51
Цитировать
Не знаю где в ассистанте это описано (скорее всего в описании кутешных контейнеров может такое быть)
Совершенно верно, вот:

Цитировать
Контейнеры могут быть вложенными. Например, вполне возможно использовать QMap<QString, QList<int> >, где типом ключа является QString, а типом значения - QList<int>. Единственный нюанс - это то, что вы должны оставить пространство между закрывающими угловыми скобками (>); иначе, компилятор C++ воспримет два символа > как оператор сдвига вправо (>>) и сообщит об ошибке.


Название: Re: Многоуровневая структуризация
Отправлено: ilot от Январь 02, 2010, 19:22
Речь о пробеле между двумя закрывающими треугольными скобками. Не знаю где в ассистанте это описано (скорее всего в описании кутешных контейнеров может такое быть), но вообще это указано и в стандарте и у Страуструпа при описании синтаксиса шаблонов.
Теперь понятно:). Дело в том, что перед тем как задать вопрос, я не поленился и скомпилировал у себя вот такой код:
Код:
QVector<char> cvec;
QVector<QVector<char>> vec;
vec.push_back(cvec);
vec.push_back(cvec);

vec[0].push_back('a');
vec[0].push_back('b');
vec[0].push_back('c');

vec[1].push_back('d');
vec[1].push_back('e');
vec[1].push_back('f');

for(QVector<QVector<char>>::iterator it = vec.begin(); it != vec.end(); it++)
{
for(QVector<char>::iterator cit = (*it).begin(); cit != (*it).end(); cit++)
qDebug() << *cit;
}

Пробелов между двумя закрывающими угловыми скобками нет. Видимо здесь все зависит от конкретного компилятора (я использовал среду VS2008). А в стандарте я посмотрю...


Название: Re: Многоуровневая структуризация
Отправлено: Igors от Январь 02, 2010, 19:58
по ходу написания своего проекта столкнулся с потребностью сохранять данные в структурированном виде. Количество элементов не известно заранее, и мало того, должно изменяться. Потому использовать буду какой-нибудь QVector<T> - подобный класс.
"Массив иассивов" никак не связан с множественным наследованием. QVector лучше использовать для простейших структур. Если же планируете держать в массиве что-то "выше травы" (хотя бы имеющее конструктор/деструктор) лучше использовать QList (пусть он потребляет чуть больше памяти)


Название: Re: Многоуровневая структуризация
Отправлено: Karl-Philipp от Январь 02, 2010, 20:09
"Массив иассивов" никак не связан с множественным наследованием. QVector лучше использовать для простейших структур. Если же планируете держать в массиве что-то "выше травы" (хотя бы имеющее конструктор/деструктор) лучше использовать QList (пусть он потребляет чуть больше памяти)
Igors, уточните, пожалуйста, где написано то, что QVector лучше испольовать для простейших структур, а QList - для "выше травы"?


Название: Re: Многоуровневая структуризация
Отправлено: Igors от Январь 02, 2010, 20:53
Igors, уточните, пожалуйста, где написано то, что QVector лучше испольовать для простейших структур, а QList - для "выше травы"?
Я это нигде не читал, просто наблюдаю как контейнеры работают. Например операции вставки/удаления. В контейнере 10 элементов. Вставляем на 5-е место. QVector вызовет 5 конструкторов копирования (для всего хвоста) так же как и std::vector. A QList спокойно переставит указатели на объекты - и готово. Пусть QList чуть больше тратит на элемент (+ sizeof(void *)) - это компенсируется удобством работы. В доке правильно написано что надо использовать QList  если ничего особенного не имеется ввиду  :)


Название: Re: Многоуровневая структуризация
Отправлено: niXman от Январь 02, 2010, 21:43
еще, произвольный доступ по индексу для QList, std::list, имеет линейную сложность. в то время как у вектора она константна.


Название: Re: Многоуровневая структуризация
Отправлено: Igors от Январь 02, 2010, 21:59
еще, произвольный доступ по индексу для QList, std::list, имеет линейную сложность. в то время как у вектора она константна.
QList имеет очень мало общего std::list  :) QList это просто массив указателей, поэтому доступ к элементу столь же быстр как и для QVector + одно разыменование. А в общем Qt молодцы - хороший контейнер сделали QList, там бы еще небольшие буги-вуги почистить - будем надеяться в 4.7


Название: Re: Многоуровневая структуризация
Отправлено: Karl-Philipp от Январь 02, 2010, 23:02
еще, произвольный доступ по индексу для QList, std::list, имеет линейную сложность. в то время как у вектора она константна.
Может я неправильно тебя понял, но произвольный доступ по индексу для QVector - константен. Смотрел тут (http://qt.nokia.com/doc/4.6/containers.html#algorithmic-complexity).


Название: Re: Многоуровневая структуризация
Отправлено: niXman от Январь 02, 2010, 23:14
Цитировать
Может я неправильно тебя понял, но произвольный доступ по индексу для QVector - константен
ну да. я это и написал.


Название: Re: Многоуровневая структуризация
Отправлено: niXman от Январь 02, 2010, 23:17
а вообще Игорь верно сказал, про QList<>.
проведенный эксперимент подтверждает, что итерация по списку вдвое дороже чем у вектора. т.е. это не список, а обертка над вектором. тогда не понятно почему этот контейнер так назвали...


Название: Re: Многоуровневая структуризация
Отправлено: Karl-Philipp от Январь 02, 2010, 23:47
Цитировать
Может я неправильно тебя понял, но произвольный доступ по индексу для QVector - константен
ну да. я это и написал.
Блин, :)
имел в виду, что произвольный доступ по индексу для QList тоже константен :)


Название: Re: Многоуровневая структуризация
Отправлено: niXman от Январь 03, 2010, 00:51
Цитировать
имел в виду, что произвольный доступ по индексу для QList тоже константен
ну да. но не для std::list