Почему строковые и векторные разные типы? - PullRequest
6 голосов
/ 13 марта 2010

Они оба являются массивами с изменяемыми размерами, и std :: basic_string не имеет каких-либо конкретно связанных с символами функций, таких как upper (). Что особенного в строке, чтобы сделать ее лучше для символьных данных?

Ответы [ 4 ]

11 голосов
/ 14 марта 2010

Большая часть причин связана с локализацией и интернационализацией (L10I18), производительностью и по историческим причинам.

Для проблем L10I18 был добавлен char_traits, и вы заметите, что потоки также имеют их. Намерение состояло в том, чтобы сделать «более умных персонажей» таким образом, но результат был бесполезен. Единственное, для чего хорошо char_traits - это специализировать некоторые из сравнений, копий и т. Д. Std :: string / wstring как встроенные функции компилятора.

Ошибка в основном связана с самими потоками UNIX, которые рассматривают символ в качестве основного «атома», а в интернационализированных графических интерфейсах, сети и т. Д. Строка является основным «атомом». Другими словами, на земле C / C ++ у нас есть «немые массивы умных символов» для строк, тогда как любой другой язык использует «умные массивы немых символов». Unicode использует последний подход.

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

basic_string иногда имеет много других оптимизаций, таких как Copy on Write и Small String Optimization. Они варьируются от одной реализации к другой.

Однако, вероятно, основная причина, по которой две вещи почти одинаковы, историческая: строки предшествуют STL, и большая часть работы, кажется, сосредоточена на том, чтобы заставить их взаимодействовать с библиотекой IOStream. Один из урбанских мифов C ++ состоит в том, что STL - это «контейнерная библиотека», которая была добавлена ​​в C ++. Это не так, и, чтобы принять его в C ++, были добавлены контейнеры. «Интерфейс STL» также был прикреплен к существующему классу строк. std :: vector был в основном взят из реализации вектора, существовавшей в AdaSTL.

6 голосов
/ 13 марта 2010

std :: string имеет много операторов, которых нет в std :: vector:

  • оператор + (добавить строку a к строке b, + не имеет смысла для векторов)
  • operator <,>, ==,! = (Сравнение строк, некоторые не имеют смысла для векторов)
  • c_str () (возвращает представление в стиле C)
  • И многое другое (включая подстроку, поиск и т. Д., Но некоторые из них реализованы в другом месте в STL и могут использоваться для векторов, вроде)

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

3 голосов
/ 13 марта 2010

Строки имеют специальные функции, связанные со строками: c_str, substr, конкатенация и другие. Кроме того, не забывайте о том, что strings автоматически добавляет '\0' в конец своих данных (и обрабатывает его должным образом с помощью конкатенации и т. Д.), Поэтому они не выполняют ту же операцию, что и vector<char> что-то в этом роде.

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

1 голос
/ 13 марта 2010

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

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