Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Qt контейнеры vs STL


Автор: pan2004 3.8.2009, 16:12
Собственно вопрос.
Имеется в виду, в каких контейнерах предпочитаете использовать там, где острой необходимости в кутешных нет. Так например, есть методы/функции Qt, принимающие/возвращающие "свои" списки и векторы - их в расчет не берем.

Автор: ecspertiza 3.8.2009, 16:52
Тут нужно не радиоБатон а чекБоксsmile Я когда какие когда Qt когда самописные.

Но проголосовал за КуТе smile

Автор: Любитель 3.8.2009, 17:12
Если есть возможность - я бы использовал Qt-шные. Интеграция (в виде того foreach-а) + фишки вроде COW радуют. К тому же они STL-совместимые, алгоритмы будут работать нормально.

Автор: pan2004 3.8.2009, 17:32
Qt foreach работает и с STL контейнерами

Автор: SABROG 3.8.2009, 17:59
Из документации:
Цитата

These container classes are designed to be lighter, safer, and easier to use than the STL containers. If you are unfamiliar with the STL, or prefer to do things the "Qt way", you can use these classes instead of the STL classes.


Вольный перевод:
Цитата

Данные классы контейнеров разработаны, чтобы быть "легче", безопасней и легко используемыми. Если вы не знакомы с STL или предпочитаете думать "по-кутешному", Вы можете использовать эти классы, вместо STL классов.


Я, например, предпочитаю думать "по-кутешному" и использовать классы, которые предоставляет Qt. Мне достаточно доводов "легче", "безопасней" и "легко использовать". Кроме того, популярных реализаций STL как минимум 4: gcc, msvc, stlport (причем тоже разных версий), bcc. Внутренняя реализация у них разная. Можно конечно использовать stlport, только вот доставлять лишние библиотеки не хочется.

Автор: andrew_121 3.8.2009, 18:32
STL.
Да, реализация у них разная, но поведение гарантированно!

Автор: Mal Hack 3.8.2009, 22:00
В модулях, выполняющих, к примеру, мат. алгоритм, т.е. не связанных с GUI использую STL, в GUI Implementation - Qt.

Автор: dix75 3.8.2009, 22:38
Только STL.
за исключением стрингов конечно.

Цитата(SABROG @  3.8.2009,  17:59 Найти цитируемый пост)
STL как минимум 4: gcc, msvc, stlport (причем тоже разных версий), bcc

Ну и что, стандартом гарантированно их поведение,  результаты и иногда скорость.

Автор: SABROG 3.8.2009, 23:00
Цитата(Mal Hack @  3.8.2009,  22:00 Найти цитируемый пост)
В модулях, выполняющих, к примеру, мат. алгоритм, т.е. не связанных с GUI использую STL, в GUI Implementation - Qt. 


Цитата(dix75 @  3.8.2009,  22:38 Найти цитируемый пост)
Ну и что, стандартом гарантированно их поведение,  результаты и иногда скорость.


В принципе поддерживаю. Сам писал на Delphi бизнес-логику с использованием STL, теперь она нормально переноситься на любой компилер. С другой стороны, совсем не сложно заменить объявление QVector на std::vector в нескольких местах. Поведение ведь одинаковое.

Автор: andrew_121 3.8.2009, 23:02
Цитата(SABROG @  3.8.2009,  23:00 Найти цитируемый пост)
совсем не сложно заменить объявление QVector на std::vector в нескольких местах. Поведение ведь одинаковое. 

Смысл опроса - 0  smile 

Автор: Mal Hack 3.8.2009, 23:30
Цитата(SABROG @  4.8.2009,  00:00 Найти цитируемый пост)
Поведение ведь одинаковое. 

Ну как тебе сказать... Глубоко я не копал, но на днях столкнулся со следующим траблом.
В общем надо было в функцию передавать фиксированный массив строк. Ну я хотел ссылкой кинуть адрес самого массива, чтобы внутри обращаться аля aaa[0], aaa[1] etc.
Короче, как раньше я делал в STL (однотипный пример):
Код
std::vector<int> aaa;
func(&aaa);


В случае с QVector такое не катит... Там надо передавать QVector::data().

Маловероятно, что это были мои глюки, несмотря на позднюю ночь.
Т.е. я к тому, что тут не все так просто для 
Цитата(SABROG @  4.8.2009,  00:00 Найти цитируемый пост)
С другой стороны, совсем не сложно заменить объявление QVector на std::vector в нескольких местах.



QStringList вроде как тоже не заюзаешь аля aaa[0] = "sdsds" без предварительной инициализации.

К тому же, самая большая проблема STL это как раз-таки не "thread safe", в отличии от Qt'шных контейнеров. Но по моему мнению thread safe в первую очередь должен программистом реализовываться при проектировании системы.

Автор: SABROG 4.8.2009, 08:50
Цитата(Mal Hack @  3.8.2009,  23:30 Найти цитируемый пост)
В случае с QVector такое не катит... Там надо передавать QVector::data().

А можно пример? data() возвращает все-таки указатель, а не ссылку. Было бы очень странно, если ссылка на объекты в C++ не будет работать.


Цитата(Mal Hack @  3.8.2009,  23:30 Найти цитируемый пост)
QStringList вроде как тоже не заюзаешь аля aaa[0] = "sdsds" без предварительной инициализации.

Имеется ввиду замена строки по индексу 0, где уже что-то есть или инициализация пустого списка таким образом, вместо insert или << ?

Автор: azesmcar 4.8.2009, 09:07
ха smile 
как раз хотел задать этот вопрос.
хотелось узнать насколько целесообразно использовать Qt контейнеры, но как посмотрю это вопрос спорный и скорее тут дело вкуса.

По теме. Я использовал Qt контейнеры для совместимости (многие функции в Qt принимают Qt контейнеры).
Насчет удобства - не скажу что разница большая, почти одно и тоже.

Автор: Любитель 4.8.2009, 10:04
Цитата(pan2004 @  3.8.2009,  17:32 Найти цитируемый пост)
Qt foreach работает и с STL контейнерами 

Да, был не прав. Почему то думал, что foreach через java-style итераторы работает smile

Цитата(SABROG @  3.8.2009,  23:00 Найти цитируемый пост)
Сам писал на Delphi бизнес-логику с использованием STL

На Делфи? STL? Я чего-то не понимаю smile 

Цитата(SABROG @  3.8.2009,  23:00 Найти цитируемый пост)
С другой стороны, совсем не сложно заменить объявление QVector на std::vector в нескольких местах. Поведение ведь одинаковое. 

Потокобезопасность это раз. Возможность возврата QVector по значению (сколько функций в Qt возвращают всякие QList?) - это два. Не, конечно, std::vector тоже можно вернуть по значению, но.. слишком уж неэффективно smile А если брать конкретно QStringList - так ещё и ряд удобных методов специально для строк. Вообщем, не вижу причин не использовать кутешные контйнеры (вот кутешные алгоритмы - да, нафиг не нужны, если мы не хотим извращаться с поддержкой никому не известных компилеров).

Автор: SABROG 4.8.2009, 11:05
Цитата(Любитель @ 4.8.2009,  10:04)
На Делфи? STL? Я чего-то не понимаю smile 

Borland Builder C++ smile

Автор: andrew_121 4.8.2009, 11:26
SABROG, А при чем тут дельфи?

Автор: Mal Hack 4.8.2009, 11:44
Цитата(SABROG @  4.8.2009,  09:50 Найти цитируемый пост)
Имеется ввиду замена строки по индексу 0, где уже что-то есть или инициализация пустого списка таким образом, вместо insert или << ? 

Последнее. В STL инициализация элементов происходит сразу. В  Кути только при инсерте и прочих вещах. 

Цитата(SABROG @  4.8.2009,  09:50 Найти цитируемый пост)
А можно пример? data() возвращает все-таки указатель, а не ссылку. Было бы очень странно, если ссылка на объекты в C++ не будет работать.

Да, data - возвращает указатель, который потом передается в функцию, что сравни приему, когда есть объект (не указатель) ааа, и в функцию надо передать адрес на этот объект, т.е. указатель, т.е. сделать ссылку.

Автор: SABROG 4.8.2009, 12:04
Цитата(andrew_121 @ 4.8.2009,  11:26)
SABROG, А при чем тут дельфи?

Ну в этой IDE сочетаются сразу C++, C#, Java и Pascal. Если раньше Borland Builder C++ был отдельным пакетом, то в BDS2006 это всё объединили и назвали Delphi. Если будет удобней, то скажу bcc.

Автор: mrbrooks 4.8.2009, 13:24
Цитата(SABROG @  4.8.2009,  12:04 Найти цитируемый пост)
Ну в этой IDE сочетаются сразу C++, C#, Java и Pascal. Если раньше Borland Builder C++ был отдельным пакетом, то в BDS2006 это всё объединили и назвали Delphi. Если будет удобней, то скажу bcc. 

Камрад - ты что то путаешь. BDS2006  - это такая же братская могила что и MSVS, в которую входят Builder C++, Delphi и как-то там названный C#. Сразу стоит заметить - это последний IDE от Borland (и очень не удачный). Java как таковой я там не видел.

Кстати что касается сабжа - тут на самом деле кому как хочется - так и юзает. Фактически аналоги stl есть у всех визуальных библиотек. И у VCL, и того же MFC. Использовать их возможно кошернее для выбранной визуальной библиотеки, под консоль, драйвера и прочее добро - думаю тут уже STL. ИМХО.

Автор: SABROG 4.8.2009, 13:44
Цитата(mrbrooks @  4.8.2009,  13:24 Найти цитируемый пост)
Камрад - ты что то путаешь

Ну может с годом ошибся, но там точно был JBuilder smile

Цитата(mrbrooks @  4.8.2009,  13:24 Найти цитируемый пост)
драйвера 

На самом деле разработчики драйверов не рекомендуют писать их на C++. Си - да.

Автор: mrbrooks 4.8.2009, 14:27
Цитата(SABROG @  4.8.2009,  13:44 Найти цитируемый пост)
Ну может с годом ошибся, но там точно был JBuilder smile

есть такой пацан - правда в братских могилах его не встречал.


Цитата(SABROG @  4.8.2009,  13:44 Найти цитируемый пост)
На самом деле разработчики драйверов не рекомендуют писать их на C++. Си - да. 

Ну дык драйвера разные бывают.

Автор: just_geek 6.8.2009, 10:27
Qt only. Поддержка STL вообще убрана из моей сборки Qt smile

Автор: SABROG 6.8.2009, 11:12
Цитата(just_geek @ 6.8.2009,  10:27)
Qt only. Поддержка STL вообще убрана из моей сборки Qt smile

А вдруг понадобится метод: std::string QString::toStdString () const?
Без поддержки stl, он работать не будет.

Автор: just_geek 6.8.2009, 11:15
Я знаю что не будет работать. Зато размер dll меньше получился.  smile Это врядли, так как никакой необходимости передавать QString в 3rdparty libs нету.

Автор: Любитель 6.8.2009, 12:42
Цитата(SABROG @  4.8.2009,  12:04 Найти цитируемый пост)
то в BDS2006 это всё объединили и назвали Delphi.

Это Borland Developer Studio, а не Delphi smile 

Автор: SABROG 6.8.2009, 13:18
Цитата(Любитель @ 6.8.2009,  12:42)
Цитата(SABROG @  4.8.2009,  12:04 Найти цитируемый пост)
то в BDS2006 это всё объединили и назвали Delphi.

Это Borland Developer Studio, а не Delphi smile

Ну вот же, пакет https://downloads.embarcadero.com/free/delphi включает в себя C++Builder 2009 Architect.

Автор: mrbrooks 6.8.2009, 13:53
Цитата(SABROG @  6.8.2009,  13:18 Найти цитируемый пост)
Ну вот же, пакет Delphi 2009 Architect включает в себя C++Builder 2009 Architect. 

это вообще ознакомительная триальная версия - просто архив - который включает в себя Delphi 2009 Architect  и C++Builder 2009 Architect.

Автор: chaos 6.8.2009, 14:07
ответил QT.
использую QT в проектах крайне редко. в текущем проекте требование что бы проект работал как и под WM так и под Symbian 6.0 по этому стараюсь использовать все QT'шное

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)