Название: Многоуровневая структуризация Отправлено: 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; Пробелов между двумя закрывающими угловыми скобками нет. Видимо здесь все зависит от конкретного компилятора (я использовал среду 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 |