STL или спокойные контейнеры?

После некоторого дополнительного исследования я нашел частичный ответ на этот вопрос в Учебное руководство WiX. Это показывает рекламируемое решение и не работает с WiX 3.0, но, учитывая, что информация, я понял его. Добавьте элемент ProgId к компоненту, содержащему Ваш исполняемый файл, как следующее:


  
    
  

myext является расширением файла без точки, и MyApplication.exe является идентификатором файла (не, называют) исполняемого файла (т.е. идентификационный атрибут элемента Файла). Это зарегистрирует тип файла в Вашем исполняемом файле и предоставит значок по умолчанию (белая страница со значком приложения на нем), который достаточен для моих потребностей. Если Вы хотите определить специализированный значок, кажется, что все еще необходимо сделать это сами, как следующее (код из связанного учебного руководства):




я не нашел хорошее решение для своего вопроса о премии все же.

Редактирование: Я начал писать это, прежде чем предыдущий ответ появился. Однако мое решение на самом деле работает, в отличие от предыдущего ответа.

181
задан Julien-L 3 November 2009 в 23:03
поделиться

10 ответов

Я начал с использования std: :( ​​w) string и исключительно контейнеров STL и преобразования в / из эквивалентов Qt, но я уже переключился на QString , и я обнаружил, что все чаще и чаще использую контейнеры Qt.

Когда дело доходит до строк, QString предлагает гораздо более полную функциональность по сравнению с std :: basic_string и это полностью поддерживает Unicode. Он также предлагает эффективную реализацию COW , на которую я привык сильно полагаться.

Контейнеры Qt:

  • предлагают ту же реализацию COW, что и в QString , то есть чрезвычайно полезен при использовании макроса Qt foreach (который выполняет копирование) и при использовании метатипов или сигналов и слотов.
  • может использовать итераторы в стиле STL или итераторы в стиле Java
  • потоковые с QDataStream
  • широко используются в Qt API
  • имеют стабильную реализацию в операционных системах. Реализация STL должна соответствовать стандарту C ++, но в остальном свободен делать то, что ему заблагорассудится (см. спор std :: string COW). Некоторые реализации STL особенно плохо.
  • предоставляют хеши, которые недоступны, если вы не используете TR1

QTL имеет философию, отличную от STL, которая хорошо резюмирована Дж. Бланшеттом: «В то время как контейнеры STL оптимизированы для чистой скорости классы контейнеров Qt были тщательно разработаны, чтобы обеспечить удобство, минимальное использование памяти и минимальное расширение кода. "
Вышеупомянутая ссылка предоставляет более подробную информацию о реализации QTL и используемых оптимизациях.

133
ответ дан 23 November 2019 в 06:08
поделиться

Я считаю, что STL - отличное программное обеспечение, однако, если мне нужно кое-что сделать KDE или связанное с Qt программирование, тогда Qt - это то, что вам нужно. Также это зависит от компилятора, который вы используете, с GCC STL работает довольно хорошо, однако, если вам нужно использовать, скажем, SUN Studio CC, тогда STL, скорее всего, доставит вам головные боли из-за компилятора, а не из STL как такового. В этом случае, поскольку компилятор заставит вас задуматься, просто используйте Qt, чтобы избавить вас от неприятностей. Только мои 2 цента ...

3
ответ дан 23 November 2019 в 06:08
поделиться

Мои пять центов: Контейнеры Qt должны работать одинаково на разных платформах. В то время как контейнеры STL зависят от реализации STL. Вы можете получить другие результаты производительности.

РЕДАКТИРОВАТЬ: Я не говорю, что STL «медленнее», но указываю на эффекты различные детали реализации.
Пожалуйста, проверьте это , а затем, возможно, это .
И это не настоящая проблема STL. Очевидно, что если у вас есть значительная разница в производительности, значит, проблема в коде, который использует STL.

3
ответ дан 23 November 2019 в 06:08
поделиться

Если данные, с которыми вы работаете, в основном используются для управления пользовательским интерфейсом на основе Qt, то определенно используйте контейнеры Qt.

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

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

8
ответ дан 23 November 2019 в 06:08
поделиться

Контейнеры Qt используют идиому копирования при записи.

15
ответ дан 23 November 2019 в 06:08
поделиться

Помимо различия в COW, контейнеры STL гораздо более широко поддерживаются на различных платформах. Qt достаточно портативен, если вы ограничиваете свою работу «основными» платформами, но STL доступен и на многих других, менее известных платформах (например, DSP от Texas Instruments).

Поскольку STL является стандартным, а не управляется одним корпорации, в общем, есть больше программистов, которые могут легко читать, понимать и изменять код STL, и больше ресурсов (книги, онлайн-форумы, конференции и т. д.), чтобы поддержать их в этом, чем есть для Qt. Это не значит, что следует избегать Qt только по этой причине; просто, при прочих равных, вы должны по умолчанию использовать STL, но, конечно, все редко бывают одинаковыми, поэтому вы Мне придется решать в своем собственном контексте, что имеет наибольший смысл.

Что касается ответа AlexKR: производительность STL гарантирована в определенных пределах, но данная реализация может использовать зависимые от платформы детали для ускорения их STL. В этом смысле вы можете получить разные результаты на разных платформах, но это никогда не будет медленнее, чем явная гарантия (по модулю ошибок).

7
ответ дан 23 November 2019 в 06:08
поделиться

Контейнеры STL:

  • Имеют гарантии производительности
  • Может использоваться в алгоритмах STL , которые также имеют гарантии производительности
  • Может использоваться сторонним C ++ библиотеки, подобные Boost
  • , являются стандартными и, вероятно, переживут проприетарные решения
  • . Поощряйте универсальное программирование алгоритмов и структур данных. Если вы пишете новые алгоритмы и структуры данных, соответствующие STL, вы можете бесплатно использовать то, что STL уже предоставляет.
22
ответ дан 23 November 2019 в 06:08
поделиться

На этот вопрос сложно ответить. Это действительно может сводиться к философскому / субъективному аргументу.

С учетом сказанного ...

Я рекомендую правило «Когда в Риме ... Делайте, как делают римляне»

Что означает, если вы находитесь в стране Qt, кодируйте, как это делают Qt'ians. Это не только для удобства чтения / согласованности. Подумайте, что произойдет, если вы сохраните все в контейнере stl, тогда вам придется передать все эти данные в функцию Qt. Вы действительно хотите управлять кучей кода, который копирует вещи в / из контейнеров Qt? Ваш код уже сильно зависит от Qt, поэтому не похоже, что вы делаете его более «стандартным», используя контейнеры stl. И какой смысл в контейнере, если каждый раз, когда вы хотите использовать его для чего-нибудь полезного,

175
ответ дан 23 November 2019 в 06:08
поделиться

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

Кроме того, если вы уже используете контейнеры Qt, может быть немного более оптимальным использовать их исключительно, поскольку вам не нужно будет включать файлы заголовков STL и, возможно, связываться с библиотеками STL. Однако, в зависимости от вашего набора инструментов, это может произойти в любом случае. Чисто с точки зрения дизайна согласованность - это вообще хорошо.

9
ответ дан 23 November 2019 в 06:08
поделиться

Думаю, это зависит от того, как вы используете Qt. Если вы используете его во всем своем продукте, вероятно, имеет смысл использовать контейнеры Qt. Если вы используете его только (например) для части пользовательского интерфейса, может быть лучше использовать стандартные контейнеры C ++.

3
ответ дан 23 November 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: