Является ли std :: string частью STL? - PullRequest
37 голосов
/ 12 мая 2011

(Когда я говорю STL, я говорю о библиотеке шаблонов, которая вращается вокруг контейнеров, итераторов, алгоритмов и функторов.)
Этот вопрос пришел в голову после того, как я подумал, что std::string в основном ведет себя как обычный контейнер с функциями begin и end (включая итератор), функцией size и возможностью использовать все из них для обычных алгоритмов STL которые работают с контейнерами / диапазонами через их итераторы (например, transform, sort, find и т. д.).

В то же время, однако, это не сам контейнер, поскольку он не вписывается в картину контейнеров, в которых хранятся произвольные данные. Кроме того, он работает с содержащимися данными в основном через функции-члены, такие как substr, find_first_of и т. Д., В то время как истинный контейнер этого не делает и позволяет алгоритмам обрабатывать это.

Кроме того, справочный сайт cplusplus и стандарт C ++ не перечисляют std::string вместе с реальными контейнерами, но в отдельной категории.
Однако на сайте STI SGI , basic_string (и, следовательно, string typedef) упоминаются вместе с другим контейнером, а ссылочный сайт basic_string заявляет, что он принадлежит категория "контейнеры".

Теперь мой вопрос: действительно ли string является частью STL или это отдельная библиотека?
И если теперь он принадлежит STL, отличается ли он от оригинального STL, разработанного Степановым?

Ответы [ 3 ]

28 голосов
/ 12 мая 2011

Нет, не совсем.И да, вид.

Существуют различные определения "STL" , в том числе:

  • Фактический HP / SGI STL,оригинальная библиотека, части которой лежала в основе стандартной библиотеки C ++.Они включали контейнеры, итераторы и алгоритмы.Строки были , а не частью этого.

  • Части стандартной библиотеки C ++, основанные на библиотеке SGI STL: контейнеры, итераторы и алгоритмы.Все еще нет строк.

  • Все из стандартной библиотеки C ++.Это определение не имеет абсолютно никакого обоснования ни в логике, ни в реальности, хотя, если следовать ему, будет включен std::string.

Обратите внимание, что фактическая STL разрабатывалась со времени стандартизации C ++ (около 13 лет назад).помните), и они переняли некоторые вещи, которые вошли в стандарт, такие как строки.Это означает, что не означает, что они изначально были там в 1998 году ... но теперь они существуют по соображениям "совместимости".


Резюме

STL был контейнерами, алгоритмами и итераторами.

Строки и потоки были приняты для C ++ 98, затем в обратном направлении - приняты для современного SGI STL.

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

Надеюсь, это поможет.

10 голосов
/ 12 мая 2011

Реального ответа на это нет. С одной стороны, std::string был разработан совершенно независимо от других контейнеров. С другой стороны, в него было добавлено достаточно, чтобы удовлетворить все требования контейнера с произвольным доступом. Если вы решите классифицировать это как часть «STL» или нет, это полностью зависит от вас - в конце концов, это просто указывает на то, что у «STL» нет единого, согласованного определения, и вероятность этого внезапно обретение ясного смысла отдаленно (мягко говоря).

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

2 голосов
/ 12 мая 2011

Это действительно часть STL.И std :: string это просто basic_string typedef.Это контейнер, специализированный (не в «специализации», означающем c ++) для хранения данных со строковой семантикой.Понятия не имею о Степанове.Стоит отметить, что STL - это «Стандартная библиотека шаблонов», а не только контейнерная часть.Это включает в себя алгоритмы, потоки и некоторые черты.

...