Какая часть знаний STL необходима для разработчика на C ++? - PullRequest
3 голосов
/ 11 июня 2011

Я хорошо знаю C ++, но никогда не зацикливаюсь на STL.Какую часть STL я должен изучить, чтобы повысить производительность и уменьшить количество дефектов в моей работе?

Спасибо.

Ответы [ 5 ]

10 голосов
/ 11 июня 2011

Я хорошо знаю C ++

Со всем должным уважением, но нет - вы этого не делаете. Стандартная библиотека или, по крайней мере, ее большие части (особенно подмножество, известное как «STL») является фундаментальной частью C ++. Не зная об этом, вы совсем немного знаете о C ++.

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

3 голосов
/ 11 июня 2011

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

В случае, если вы уже знакомы с основами шаблонов, я бы порекомендовал кратко взглянуть на проектный документ STL.На самом деле это вторая стадия хлопот для людей, еще не знакомых с ней.Причина этого заключается в том, что STL разработан не в типичной объектно-ориентированной парадигме, а в рамках универсального программирования парадигмы.

Имея это в виду, хорошее начало может быть таким* вступительная статья .Термины, используемые в компонентах STL, объясняются там.Обратите внимание, что это относительно старый текст, ориентированный на реализацию SGI (который предшествует стандарту C ++ и неправильно упоминает, например, контейнеры на основе хеша как его часть).Тем не менее, теория все еще в силе.

Что ж, если вы уже знаете большинство вещей, которые я сказал до этого момента, просто прыгайте прямо в топис, предоставленный другими.

1 голос
/ 25 апреля 2013

Вы упоминаете об улучшении вашей производительности и уменьшении дефектов. Есть общие рекомендации, которые вы можете использовать для этого. Я предполагаю, что c ++ 11, и я упоминаю немного больше, чем stl (умные указатели):

  1. Используйте контейнеры, они будут управлять памятью для вас. Вы избавляетесь от new для массивов C, а затем, например, delete. Для динамических массивов используйте std::vector. У вас также есть хеш-таблицы в std::unordered_map и сбалансированные деревья с std::map. Есть еще контейнеры, посмотрите здесь .
  2. Используйте std::array вместо простых массивов C, когда это возможно: они никогда не распадаются на указатели при передаче в качестве аргументов функциям, что позволяет избежать очень отвратительных ошибок.
  3. Используйте умные указатели и навсегда забудьте о голом new и его совпадении delete в коде. Это может уменьшить количество ошибок намного больше, чем вы ожидаете, особенно при наличии исключений.
  4. Используйте std::make_shared, когда это возможно. Вы можете использовать его для непосредственного выделения shared_ptr в качестве аргумента функции, которая принимает std::shared_ptr. С голым new это невозможно.
  5. Используйте алгоритмы вместо кодированных вручную циклов. Код будет намного более читабельным и, как правило, более производительным.

С этим советом ваш код должен выглядеть ближе (но не обязательно равен или семантически эквивалентно) к C # или Java, в котором ручное управление памятью исчезает. Это даже лучше, чем сборка мусора во многих сценариях, поскольку у вас есть детерминированные гарантии того, когда ресурс будет освобожден.

0 голосов
/ 11 июня 2011

Я бы сказал, что алгоритмы из <algorithm> действительно очистят ваш код и в то же время сделают ваш код более кратким.

Очевидно, знание всего Containers поможет вам оптимизировать узкие места в вашем коде, вызванные определенным выбором контейнера, который не является оптимальным (но обязательно сначала профилируйте).

Это в значительной степени основы, и они будуточень поможет вам сделать более надежный код.

После этого вы можете углубиться в умные указатели , такие как std::shared_ptr, которые почти всегда лучше, чем обычные указатели (в моем случае, по крайней мере).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...