Мне кажется, что многие большие библиотеки C ++ создают свои собственные строковые типы. В коде клиента вы должны либо использовать один из библиотеки ( QString
, CString
, и fbstring
т.д., я уверен , что кто - нибудь может назвать несколько) или сохранить преобразование между стандартным типом и одна библиотека использует (который большую часть времени включает в себя хотя бы один экземпляр).
Итак, есть ли конкретная ошибка или что-то не так std::string
(как auto_ptr
семантика была плохой)? Изменилось ли это в C ++ 11?
java.lang.String
(отсутствие перегрузки операторов и т. Д.) Затрудняет использование чего-либо еще.Ответы:
Большинство этих больших библиотек C ++ были запущены до того, как
std::string
были стандартизированы. Другие включают дополнительные функции, которые были стандартизированы поздно или еще не стандартизированы, такие как поддержка UTF-8 и преобразование между кодировками.Если бы эти библиотеки были реализованы сегодня, они, вероятно, решили бы написать функции и итераторы, которые работают с
std::string
экземплярами.источник
char
гарантированно достаточно большой, чтобы вместить любую кодовую точку UTF-8. AFAIK, это единственная «поддержка», предоставляемая C ++ 98.wchar_t
она недостаточно велика для представления всех кодовых точек Unicode Кроме того, была целая дискуссия о том, что UTF-16 считается вредным, когда был сделан очень убедительный аргумент, что UTF-8 должен использоваться исключительно …Строка - это большое затруднение C ++.
Первые 15 лет вы вообще не предоставляете строковый класс - вынуждаете каждого компилятора на каждой платформе и каждого пользователя создавать свои собственные.
Затем вы делаете что-то, что сбивает с толку, будь то API-интерфейс для манипулирования всей строкой или просто контейнер символов STL, с некоторыми алгоритмами, которые дублируют алгоритмы в std :: Vector или отличаются.
Там, где очевидная строковая операция, такая как replace () или mid (), включает в себя такой беспорядок итераторов, что вам нужно ввести новое ключевое слово 'auto', чтобы сохранить соответствие оператора на одной странице, и побуждает большинство людей отказаться от всего языка. ,
И тогда у вас есть Unicode 'поддержка' и std :: wstring, что просто так .....
Спасибо, я чувствую себя намного лучше.
источник
std::string
. Отсутствие класса Стринг в 1983 году не оправдывает, что сейчас их больше.На самом деле ... есть несколько проблем
std::string
, и да, это немного лучше в C ++ 11, но давайте не будем забегать вперед.QString
иCString
являются частью старых библиотек, поэтому они существовали до стандартизации C ++ (во многом как SGI STL). Таким образом, они должны были создать класс.fbstring
решать очень конкретные проблемы производительности. Стандарт предписывает интерфейс, а алгоритмическая сложность гарантирует минимумы, однако это детали качества реализации независимо от того, будет ли это быстрым или нет.fbstring
имеет определенные оптимизации (например, связанные с хранилищем или быстрееfind
).Другие проблемы, которые не были вызваны здесь (en vrac):
std::string
не кодирует и не имеет специального кода для UTF-8, легко хранить в нем строку UTF-8 и непреднамеренно ее повреждатьstd::string
Интерфейс раздут , многие методы могли бы быть реализованы как свободные функции, а многие дублированы для соответствия как интерфейсу на основе индекса, так и интерфейсу на основе итератора.источник
c_str()
возвращает указатель на непрерывное хранилище, что обеспечивает некоторую совместимость с Си. Однако вы не можете изменить указанные данные. Типичные обходные пути включают использованиеvector<char>
.&s[0]
это, это уже не имеет значения :)&s[0]
может не указывать на NUL-оканчивающуюся строку (еслиc_str()
не был вызван с момента последней модификации).c_str()
Msgstr " Возвращает: указательp
такой, чтоp + i == &operator[](i)
для каждогоi
в[0,size()]
".Помимо приведенных здесь причин, есть еще одна - двоичная совместимость . Авторы библиотек не контролируют, какую
std::string
реализацию вы используете и имеет ли она ту же структуру памяти, что и их.std::string
является шаблоном, поэтому его реализация взята из ваших локальных заголовков STL. Теперь представьте, что вы используете локальную версию STL с оптимизированной производительностью, полностью совместимую со стандартом. Например, вы, возможно, решили использовать статический буфер в каждом,std::string
чтобы уменьшить количество динамических выделений и пропусков кэша. В результате компоновка памяти и / или размер вашей реализации отличается от библиотеки.Если отличается только компоновка, некоторые
std::string
вызовы функций-членов в экземплярах, переданных из библиотеки в клиент, или наоборот, могут завершиться ошибкой в зависимости от того, какие элементы были смещены.Если размер также отличается, все типы библиотек, имеющие
std::string
член, будут иметь разный размер при проверке в библиотеке и в клиентском коде. Для элементов данных, следующих заstd::string
элементом, также будут смещены смещения, и любой метод прямого доступа / встроенного доступа, вызванный из клиента, будет возвращать мусор, несмотря на то, что при отладке библиотеки он выглядит «нормально».Итог - если библиотека и клиентский код скомпилированы против разных
std::string
версий, они будут просто отлично связываться, но это может привести к некоторым неприятным, трудным для понимания ошибкам. Если вы измените своюstd::string
реализацию, все библиотеки, выставляющие элементы из STL, должны быть перекомпилированы, чтобы соответствоватьstd::string
макету клиента . И поскольку программисты хотят, чтобы их библиотеки были надежными, вы редко будете видеть ихstd::string
где-либо открытыми.Чтобы быть справедливым, это относится ко всем типам STL. IIRC у них нет стандартизированного расположения памяти.
источник
Есть много ответов на этот вопрос, но вот некоторые из них:
Наследие. Многие строковые библиотеки и классы были написаны до существования std :: string.
Для совместимости с кодом на C. Библиотека std :: string - это C ++, где также есть другие строковые библиотеки, которые работают с C и C ++.
Избегать динамических распределений. Библиотека std :: string использует динамическое размещение и может не подходить для встроенных систем, прерываний или кода, связанного с в реальном времени, или для низкоуровневой функциональности.
Шаблоны. Библиотека std :: string основана на шаблонах. До недавнего времени многие компиляторы C ++ имели плохо работающую или даже некорректную поддержку шаблонов. К сожалению, я работаю в отрасли, которая использует множество пользовательских инструментов, и один из наших наборов инструментов от крупного игрока в отрасли «официально» не поддерживает 100% C ++ (с ошибочными шаблонами и т. Д.).
Вероятно, есть еще много веских причин.
источник
Это в основном о Unicode. Стандартная поддержка Юникода в лучшем случае ужасна, и у каждого есть свои потребности в Юникоде. Например, ICU поддерживает все функции Unicode, которые вы когда-либо могли захотеть, за самым отвратительным интерфейсом автоматически сгенерированного из Java, который вы только можете себе представить, и если вы работаете в Unix, зависание с UTF-16 может быть не вашей идеей хорошее время.
Кроме того, многим людям нужны разные уровни поддержки Unicode - не всем нужны сложные API-интерфейсы для разметки текста и тому подобное. Таким образом, легко понять, почему существует множество строковых классов: стандартный класс - отстой, и у всех есть потребности, отличные от новых, когда никому не удается создать отдельный класс, который может выполнять множество кроссплатформенных приложений с поддержкой Юникода с приятным интерфейсом.
По моему мнению, это в основном вина Комитета C ++ за неправильное предоставление поддержки Unicode - в 1998 или 2003 году, возможно, это было понятно, но не в C ++ 11. Надеюсь, в C ++ 17 они будут лучше.
источник
Это потому, что у каждого программиста есть, что доказывать, и он чувствует необходимость создать свой собственный, более быстрый класс строк для своей замечательной функции. Обычно это немного излишне и приводит к всевозможным дополнительным преобразованиям строк в моем опыте.
источник