Подтвердить что ты не робот

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

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

Спасибо,

R

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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


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

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

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

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

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

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

Идем дальше. Это хороший опыт.

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

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

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

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

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