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

Когда следует использовать алгоритмы STL вместо использования собственных?

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

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

Я никогда не видел код на С++, который использует алгоритмы STL. Из примера кода в статьях веб-страниц в проекты с открытым исходным кодом я не видел их использования.

Используются ли они чаще, чем кажется?

4b9b3361

Ответ 1

Короткий ответ: Всегда.

Длинный ответ: Всегда. Это то, для чего они есть. Они оптимизированы для использования с контейнерами STL, и они быстрее, понятнее и более идиоматичны, чем все, что вы можете написать себе. Единственная ситуация, которую вы должны рассмотреть, сводя свою собственную, - это если вы можете сформулировать очень конкретную критически важную потребность, которую не удовлетворяют алгоритмы STL.

Отредактировано для добавления: (Хорошо, так что на самом деле не всегда, но если вам нужно спросить, следует ли использовать STL, ответ "да".)

Ответ 2

У вас уже есть несколько ответов, но я не могу согласиться ни с одним из них. Некоторые из них довольно близки к знаку, но не упоминают о решающем моменте (конечно, ИМО).

По крайней мере, для меня ключевой момент довольно прост: вы должны использовать стандартные алгоритмы, когда они помогают прояснить код, который вы пишете.

Это действительно так просто. В некоторых случаях то, что вы делаете, потребует тайного вызова, используя std::bind1st и std::mem_fun_ref (или что-то в этом порядке), которые чрезвычайно плотные и непрозрачные, где цикл for будет почти тривиально простым и понятным. В таком случае, продолжайте и используйте цикл for.

Если нет стандартного алгоритма, который делает то, что вы хотите, проявите осторожность и посмотрите еще раз - вы часто пропускаете то, что действительно будет делать то, что вы хотите (одно место, которое часто пропускалось: алгоритмы в <numeric> часто полезны для нечислового использования). Посмотрев пару раз и подтвердив, что на самом деле нет стандартного алгоритма для того, чтобы делать то, что вы хотите, вместо того, чтобы писать этот цикл for (или что-то еще) inline, подумайте о написании универсального алгоритма, чтобы сделать то, что вам нужно. Если вы используете его на одном месте, есть неплохие шансы, что вы можете использовать его еще два или три, и в этот момент это может стать большой победой в ясности.

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

Ответ 3

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

Ответ 4

Когда следует использовать алгоритмы STL вместо использования собственных?

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

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

Ответ 5

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

Ответ 6

Есть много хороших алгоритмов, помимо таких, как std::foreach.

Однако существует множество нетривиальных и очень полезных алгоритмов:

  • Сортировка: std::sort, std::upper_bound, std::lower_bound, std::binary_search
  • Min/Max std::max, std::min, std::partition, std::min_element, std::max_element
  • Искать как std::find, std::find_first_of и т.д.

И многие другие.

Алгоритмы, такие как std::transform, очень полезны с лямбда-выражениями С++ 0x или такими вещами, как boost::lambda или boost::bind

Ответ 7

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

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

-

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

Ответ 8

Единственный раз, когда я не использую алгоритмы STL, - это когда различия в межплатформенной реализации влияют на результаты моей программы. Это произошло только в одном или двух редких случаях (на Playstation 3). Хотя интерфейс STL стандартизирован на разных платформах, реализация не является.

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

Однако подавляющее большинство времени, использующее STL, - это путь. И в других моих (не видеоиграх) работах я использовал только STL.

Ответ 9

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

Я использую STL в течение последних 6 лет, и хотя я пытался использовать алгоритмы STL в любом месте, в большинстве случаев это делало бы мой код более неясным, поэтому я вернулся к простому циклу. Теперь, когда С++ 0x является обратным, код, кажется, всегда выглядит проще с ними.

Проблема в том, что к настоящему времени поддержка С++ 0x по-прежнему ограничена несколькими компиляторами, даже если стандарт еще не закончен. Поэтому, вероятно, нам придется подождать несколько лет, чтобы действительно увидеть широкое использование алгоритмов STL в производственном коде.

Ответ 10

Имейте в виду, что алгоритмы STL охватывают множество баз, но большинство разработчиков С++, вероятно, в конечном итоге будут кодировать что-то, что эквивалентно std::find(), std::find_if() и std::max() почти каждый день их трудоспособности ( если они уже не используют STL-версии). Используя версии STL, вы отделите алгоритм от логического потока вашего кода и от представления данных.

Для других менее часто используемых алгоритмов STL, таких как std::merge() или std::lower_bound(), это чрезвычайно полезные подпрограммы (первый для объединения двух отсортированных контейнеров, второй для разработки, где вставлять элемент в контейнер, чтобы он упорядочивался). Если бы вы попытались реализовать их сами, то, вероятно, это сделало бы несколько попыток (алгоритмы не сложны, но вы, вероятно, получите ошибки "один за другим" и т.п.).

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

Ответ 11

Я бы не использовал STL в двух случаях:

  • Когда STL не предназначен для вашей задачи. STL является почти лучшим для общих целей. Однако для конкретных приложений STL не всегда может быть лучшим. Например, в одной из моих программ мне нужна огромная хеш-таблица, в то время как эквивалентность hashmap STL/tr1 занимает слишком много памяти.

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

Ответ 12

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

Для большинства землян ответ НИКОГДА!

Ответ 13

Используются ли они чаще, чем кажется?

Я никогда их не видел; кроме книг. Возможно, они используются в реализации самого STL. Возможно, они станут более используемыми, потому что их проще использовать (см., Например, Лямбда-функции и выражения) или даже устаревать (см., Например, Диапазон для цикла), в следующей версии С++.