Russian Qt Forum
Ноябрь 26, 2024, 05:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Многоуровневая структуризация  (Прочитано 8749 раз)
JamS007
Гость
« : Январь 01, 2010, 17:32 »

Здравствуйте,

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

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

QVector<QVector<T>> - явно не то...  Улыбающийся

спасибо.

Записан
Makss
Гость
« Ответ #1 : Январь 01, 2010, 18:09 »

QVector< QVector<T> > vec; - это оно и есть

vec[0][0] - ваше значение
Записан
JamS007
Гость
« Ответ #2 : Январь 01, 2010, 18:28 »

вот... не додумался, что из-за пробела может не работать... Спасибо!
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Январь 01, 2010, 18:29 »

>>вот... не додумался, что из-за пробела может не работать... Спасибо!
А это потому-что асиситент не прочитал, там об этом нюансе упомянуто.
Записан

Юра.
ilot
Гость
« Ответ #4 : Январь 02, 2010, 14:34 »

>>вот... не додумался, что из-за пробела может не работать... Спасибо!
А это потому-что асиситент не прочитал, там об этом нюансе упомянуто.
О каком пробеле, если не секрет, идет речь? и где это упомянуто в ассистенте?
QVector<QVector<T>> - явно не то...  Улыбающийся
отлично работает...
Записан
BlackTass
Гость
« Ответ #5 : Январь 02, 2010, 15:17 »

О каком пробеле, если не секрет, идет речь? и где это упомянуто в ассистенте?
Речь о пробеле между двумя закрывающими треугольными скобками. Не знаю где в ассистанте это описано (скорее всего в описании кутешных контейнеров может такое быть), но вообще это указано и в стандарте и у Страуструпа при описании синтаксиса шаблонов.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Январь 02, 2010, 18:51 »

Цитировать
Не знаю где в ассистанте это описано (скорее всего в описании кутешных контейнеров может такое быть)
Совершенно верно, вот:

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

Юра.
ilot
Гость
« Ответ #7 : Январь 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). А в стандарте я посмотрю...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Январь 02, 2010, 19:58 »

по ходу написания своего проекта столкнулся с потребностью сохранять данные в структурированном виде. Количество элементов не известно заранее, и мало того, должно изменяться. Потому использовать буду какой-нибудь QVector<T> - подобный класс.
"Массив иассивов" никак не связан с множественным наследованием. QVector лучше использовать для простейших структур. Если же планируете держать в массиве что-то "выше травы" (хотя бы имеющее конструктор/деструктор) лучше использовать QList (пусть он потребляет чуть больше памяти)
Записан
Karl-Philipp
Гость
« Ответ #9 : Январь 02, 2010, 20:09 »

"Массив иассивов" никак не связан с множественным наследованием. QVector лучше использовать для простейших структур. Если же планируете держать в массиве что-то "выше травы" (хотя бы имеющее конструктор/деструктор) лучше использовать QList (пусть он потребляет чуть больше памяти)
Igors, уточните, пожалуйста, где написано то, что QVector лучше испольовать для простейших структур, а QList - для "выше травы"?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Январь 02, 2010, 20:53 »

Igors, уточните, пожалуйста, где написано то, что QVector лучше испольовать для простейших структур, а QList - для "выше травы"?
Я это нигде не читал, просто наблюдаю как контейнеры работают. Например операции вставки/удаления. В контейнере 10 элементов. Вставляем на 5-е место. QVector вызовет 5 конструкторов копирования (для всего хвоста) так же как и std::vector. A QList спокойно переставит указатели на объекты - и готово. Пусть QList чуть больше тратит на элемент (+ sizeof(void *)) - это компенсируется удобством работы. В доке правильно написано что надо использовать QList  если ничего особенного не имеется ввиду  Улыбающийся
Записан
niXman
Гость
« Ответ #11 : Январь 02, 2010, 21:43 »

еще, произвольный доступ по индексу для QList, std::list, имеет линейную сложность. в то время как у вектора она константна.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Январь 02, 2010, 21:59 »

еще, произвольный доступ по индексу для QList, std::list, имеет линейную сложность. в то время как у вектора она константна.
QList имеет очень мало общего std::list  Улыбающийся QList это просто массив указателей, поэтому доступ к элементу столь же быстр как и для QVector + одно разыменование. А в общем Qt молодцы - хороший контейнер сделали QList, там бы еще небольшие буги-вуги почистить - будем надеяться в 4.7
Записан
Karl-Philipp
Гость
« Ответ #13 : Январь 02, 2010, 23:02 »

еще, произвольный доступ по индексу для QList, std::list, имеет линейную сложность. в то время как у вектора она константна.
Может я неправильно тебя понял, но произвольный доступ по индексу для QVector - константен. Смотрел тут.
Записан
niXman
Гость
« Ответ #14 : Январь 02, 2010, 23:14 »

Цитировать
Может я неправильно тебя понял, но произвольный доступ по индексу для QVector - константен
ну да. я это и написал.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.