Является ли std::string частью STL?
(Когда я говорю STL, я говорю о библиотеке шаблонов, которая вращается вокруг контейнеров, итераторов, алгоритмов и функторов.)
Этот вопрос напомнил, думая, что std::string
в основном ведет себя как обычный контейнер с функциями begin
и end
(включая итератор), функцией size
и возможностью использовать все те, которые используются для обычных алгоритмов STL которые работают на контейнерах/проходят через их итераторы (например, transform
, sort
, find
и т.д.).
В то же время, однако, это не сам контейнер, так как он не соответствует изображению контейнеров, хранящих суровые данные. Кроме того, он работает с содержащимися данными главным образом через функции-члены, такие как substr
, find_first_of
и т.д., В то время как истинный контейнер не делает этого и позволяет алгоритмам обрабатывать это.
Кроме того, справочный сайт cplusplus и стандарт С++ не отображают std::string
вместе с реальными контейнерами, но в отдельной категории.
Однако на сайте SGI STL basic_string
(и, следовательно, string
typedef) упоминаются вместе с другим контейнером, а basic_string
указывает, что он относится к категории "контейнеры".
Теперь мой вопрос: действительно ли string
часть STL или это отдельная библиотека?
И если теперь это относится к STL, отличается ли он от оригинального STL, разработанного Степановым?
Ответы
Ответ 1
Нет, не совсем. И да, вроде.
Существуют различные определения "STL" , в том числе:
-
Фактическая HP/SGI STL, исходная библиотека, на которой основана стандартная библиотека С++. Они включали контейнеры, итераторы и алгоритмы. Строки не были частью этого.
-
Части стандартной библиотеки С++, основанные на библиотеке SGI STL: контейнеры, итераторы и алгоритмы. Все еще нет строк.
-
Вся стандартная библиотека С++. Это определение абсолютно не основывается на логике или реальности, хотя, если следовать, std::string
будет включен.
Обратите внимание, что фактический STL развился с тех пор, как С++ был стандартизирован (около 13 лет назад, помните), и они были в обратном порядке - приняли некоторые вещи, которые вошли в стандарт, например, строки. Это не означает, что они изначально были там в 1998 году... но они теперь существуют по причинам "совместимости".
Резюме
STL - это контейнеры, алгоритмы и итераторы.
Строки и потоки были приняты для С++ 98, а затем назад - для современного SGI STL.
Будут ли строки "частью STL" или нет, зависит от того, следуете ли вы логике и причине или называете стандартную библиотеку "STL".
Надеюсь, что это поможет.
Ответ 2
На это нет реального ответа. С одной стороны, std::string
был разработан полностью независимо от других контейнеров. С другой стороны, он достаточно добавил для удовлетворения всех требований контейнера с произвольным доступом. Если вы решите классифицировать это как часть "STL" или не полностью зависит от вас - в конце концов, это просто указывает на то, что "STL" не хватает единого согласованного определения и шансов на него внезапно получение четкого значения является отдаленным (чтобы это было хорошо).
IOW, "STL" - это отвратительная аббревиатура от использования, потому что люди используют ее для обозначения как минимум трех разных вещей - но, к сожалению, нет лучшей аббревиатуры вокруг с более четко определенным значением, поэтому STL остается в использовании и будет вероятно, продолжать делать это (и продолжать препятствовать коммуникации) на неопределенный срок.
Ответ 3
Это действительно часть STL. И std::string - это просто basic_string typedef. Это контейнер, специализированный (не в С++ "специализация", означающий:)) для хранения данных со строковой семантикой.
Впрочем, о Степанове не знаю.
Стоит упомянуть, что STL является "стандартной библиотекой шаблонов", а не только дочерней частью контейнера. Это включает в себя алгоритмы, потоки и некоторые черты.