Стандартная библиотека C ++ - когда я должен ее использовать, а когда нет? - PullRequest
35 голосов
/ 22 января 2011

Мне было интересно, как часто люди фактически используют большую часть стандартной библиотеки c ++, особенно содержимое заголовков <algorithm> и <numeric>.Похоже, учебники рекомендуют их, но я не видел, чтобы они вообще использовались в различных проектах, которые я просеял (совпадение?), И лично мне кажется, что проще каждый раз писать соответствующие простые простые алгоритмы, а не запоминать илиобратитесь к ссылке на эти заголовки каждый раз.Я просто ленивый или упрямый?Есть ли прирост производительности при использовании этих библиотек?

Спасибо,

R

Ответы [ 8 ]

46 голосов
/ 22 января 2011

Возможно, вы ленивы или упрямы. Лично я все время использую их в рабочем коде.

Я делаю это не для фантазии, и я делаю это не потому, что мне нравится писать «код космической эры». Скорее, я делаю это, потому что я программист-параноик, и я знаю, что производственные среды - это враждебные места, которые искажают код и превращают мои программы в кучи куч бесполезных байтов, если им дается шанс.

Я делаю это потому, что живу под девизом: «Лучший код - это код, который ты никогда не пишешь». Требуется время, чтобы научиться эффективно использовать STL & Std Lib , но как только вы это сделаете, вы обнаружите, что его можно использовать так, что теперь 1000 строк кода станут, возможно, 100. Эти 100 могут Пишите столько же времени, сколько исходная 1000, но точек сбоев меньше. Код может быть более надежным, если вы стоите на плечах других.

8 голосов
/ 22 января 2011

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

6 голосов
/ 22 января 2011

Почти каждый, кто использует C ++, использует STL, , особенно <algorithm>.Вы действительно не хотите писать функции сортировки самостоятельно;Вы просто в конечном итоге будете делать ошибки, и в итоге производительность, вероятно, будет хуже.

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

2 голосов
/ 22 января 2011

Какие проекты вы просматриваете? Это профессиональные проекты или что-то случайное?

Одна из вещей, которые я заметил, - это то, что многие устаревшие коды типов (я работал над базой кода, предшествовавшей C ++ 98) избегают стандартной библиотеки C ++ из-за проблем производительности в то время Или просто потому, что в то время библиотек не было. Конечно, в некоторых средах (встроенные системы, игры, защита и т. Д.) Могут быть другие требования, которые во многих случаях исключают использование стандартной библиотеки C ++, например, мой коллега работал в обороне и вообще не мог использовать STL. , из-за требований клиента не использовать его.


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

Сторонняя библиотека (давайте выберем пример типа Boost), если в ней есть то, что вам нужно. Такая библиотека, как Boost, пользуется уважением, имеет репутацию кода исключительного качества и используется / проверяется / поддерживается многими, многими людьми.

Окончательный выбор - изобретение вашего собственного кода, я думаю, это действительно можно разделить на несколько категорий:

  1. Самообучение - написание кода просто для изучения, но это означает, что вы не ожидаете, что вы отправите его как рабочий код.
  2. У вас есть особые требования, которые не удовлетворяются чем-либо, что может быть приобретено, или должно быть адаптировано из чего-то другого. Этого много, вам может понадобиться написать свои собственные алгоритмы, специфичные для того, что вы делаете.

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

Если вы можете переложить это беспокойство на других разработчиков, имеющих опыт работы с таким кодом, И пройти тестирование тысяч людей? Это большая победа!

2 голосов
/ 22 января 2011

Когда следует использовать стандартную библиотеку C ++?Когда он предоставляет нужную вам функцию.

Известно, что некоторые вещи, такие как for_each, не очень хорошо поддерживаются языком - вот для чего лямбда-выражения в C ++ 0x.

0 голосов
/ 22 января 2011

Вы должны использовать стандартные библиотеки на всех языках, а не только на C ++. Это в значительной степени основное правило в программировании в наши дни.

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

Многие люди страдали, потели, потели и боролись за эти годы, чтобы эти библиотеки работали должным образом. Объединенные усилия по написанию, отладке и обсуждению каждой конкретной детали реализации, вероятно, могут быть измерены в десятилетия . Кроме того, бесчисленные машинные циклы были потрачены на выполнение теста за тестом, чтобы убедиться, что все работает в соответствии со спецификациями.

Тем не менее, почти каждый программист время от времени думал об этом. Вы знаете один.

«Я могу стать лучше за один вечер».

Я знаю. Я понимаю. Я был там.

Давай. Это хороший опыт.

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

Позже путь перестанет быть таким прямым; оно начнет разветвляться. Вскоре вы обнаружите, что пробуете много разных путей и часто возвращаетесь. И иногда вы будете сталкиваться с глубокими пропастями алгоритмической неопределенности или утомительной рефакторинговой горой.

Все это, пока вы наблюдаете, как ваши сверстники несутся по чистой, прямой, ухоженной трассе Стандартных библиотек.

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

В заключение - если вы хотите добраться куда-то, независимо от того, насколько быстро вы сможете бежать, вождение автомобиля доставит вас туда быстрее и безопаснее (если вы не идете в магазин внизу за молоком)

0 голосов
/ 22 января 2011

это не прямой ответ на ваш вопрос, извините.просто крикЯ прочитал предыдущие ответы и решил добавить свои два цента.особенно о <algorithm> и <numeric>

Какая основная парадигма C ++?Конечно, ООП, древесные киты и т. Д. У каждого интервью на С ++ есть вопрос по этому поводу.Но меня никогда не спрашивали о функциональном программировании.<algorithm> и <numeric> это та функциональная часть ИМХО.Чтобы использовать их активно, вам нужно думать немного иначе, чтобы ваша программа создавала место для их использования.Типичные рассуждения: зачем использовать какую-либо сортировку, если я могу использовать std :: map или std :: set?разве это не дьявол преждевременной оптимизации?Окончательный результат будет принят в подавляющем большинстве случаев, просто купите лучшее оборудование.Сложная реализация, как правило, намного проще для кода, чем для изучения этих более 100 алгоритмов и, что важнее, для понимания, как и когда их использовать.это полная ракетостроение.

Рассмотрим статистически среднюю компанию по разработке программного обеспечения со 100 программистами на C ++.будет около 10 хороших специалистов.есть ли у них шанс распространить там хороший стиль?да, если они прирожденные лидеры и достаточно долго работают в компании.им нужно постоянно бороться с предрассудками, такими как «исключения - очень плохая идея», «виртуальные методы работают медленно» и «это просто int, почему это не поточно-ориентировано?»и их код не может быть понят другими другими из-за интенсивного использования <algorithm> и <numeric>

0 голосов
/ 22 января 2011

Многие существующие проекты C ++ не используют стандартную библиотеку, потому что они были запущены до того, как вы могли полагаться на доступность стандартной библиотеки - я говорю о коде, история версий которого уходит от десяти до пятнадцати лет, здесь,Я также слышал, что некоторые современные среды (например, Android) все еще не дают вам полной среды выполнения C ++, поэтому, если вам нужно быть переносимым в эти среды, вы все равно не сможете его использовать.

Другая причина заключается в том, что некоторые чрезвычайно большие программы (у меня есть личный опыт работы с внутренностями Firefox, и я слышал, что это также верно и в отношении OpenOffice) создаются с отключенной поддержкой исключений, поскольку считается, что она страстно влияет на производительность.проблемы (на самом деле это может быть верно для ABI MSVC ++ и / или для программ с нелепым размером, таких как приведенные выше) - но вы не можете использовать большую часть среды выполнения C ++, если вы это сделаете.

Эторазочарование, но это индустрия для тебя.

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