Хорошая C ++ библиотека для работы со строками - PullRequest
37 голосов
/ 09 июля 2009

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

  1. Разделение строки на массив / вектор / список
  2. Простой и интуитивно понятный поиск и замена без учета регистра
  3. Поддержка i18n, не беспокоясь о строке или wstring
  4. Преобразование в и из int, число с плавающей запятой, double
  5. Преобразование в и из UTF-8, UTF-16 и других кодировок
  6. поточно-/ возвратный
  7. Небольшая площадь и отсутствие зависимости
  8. Очень портативный и кроссплатформенный

Я нашел Qt QString полезным, а также нашел CBString http://bstring.sourceforge.net/bstrFAQ.shtml

Любые другие предложения и сравнения? Спасибо.

Ответы [ 7 ]

26 голосов
/ 29 августа 2009

Библиотека C ++ String Toolkit (StrTk) - это бесплатная библиотека, которая состоит из надежных, оптимизированных и переносимых универсальных алгоритмов и процедур обработки строк для языка C ++. Библиотека разработана для простоты использования и интеграции в существующий код.

Библиотека имеет следующие возможности:

  • Универсальный строковый токенизатор и итераторы токенов
  • Сплит процедуры
  • Пользовательские политики разделителя и разделителя (простые и регулярные выражения и т. Д.)
  • Преобразования между данными и шестнадцатеричными и базовыми-64
  • Процедуры снятия и замены на месте
  • Подстановочные знаки и глобинг
  • Быстрая обработка 2D-сетки токенов
  • Расширяемые шаблоны обработки строк

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

Совместимые компиляторы C ++:

  • GCC 4.0 +
  • Компилятор Intel C ++ 9.0 +
  • Microsoft Visual C ++ 8.0 +
  • Comeau C / C ++ 4.1+

Источник:

10 голосов
/ 09 июля 2009

Библиотека C ++ String Algorithms из Boost имеет практически все необходимые функции.

10 голосов
/ 09 июля 2009

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

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

3 голосов
/ 09 июля 2009

Bstring - Хотя я никогда не пробовал сам, набор функций и скорость представлены на их сайте. По вашему выбору лицензия GPL или BSD также является хорошей степенью свободы.

Кроме того, название говорит о том, что лучше, так как они могут лгать? :)

2 голосов
/ 29 сентября 2017

Я настоятельно рекомендую использовать ICU UnicodeString, поскольку он поддерживает все общие функции работы со строками, а также поддержку i18n.

Не знаете, что такое ICU? Вот выдержка из Википедии :

International Components for Unicode (ICU) - это проект с открытым исходным кодом зрелых библиотек C / C ++ и Java для поддержки Unicode, интернационализации программного обеспечения и глобализации программного обеспечения. ICU широко переносим для многих операционных систем и сред. Он дает приложениям одинаковые результаты на всех платформах, а также между программным обеспечением C, C ++ и Java. Проект ICU спонсируется, поддерживается и используется IBM и многими другими компаниями.

2 голосов
/ 09 июля 2009

Я нашел wxString удобным в использовании, и у него много функций. Хотя это часть большой библиотеки (wxWidgets) и, возможно, слишком большая, когда вы просто хотите использовать строки. Он также работает без компонентов GUI, когда вы просто используете wxBase, который содержит wxString и «несколько» других компонентов.

РЕДАКТИРОВАТЬ: здесь ссылка на документацию. Он принимает стандартные функции std :: string, а также некоторые другие. Я всегда нахожу BeforeFirst () и AfterFirst () очень удобными, когда мне нужно разобрать какой-то текст. И это действительно хорошо задокументировано.

1 голос
/ 09 июля 2009

Для конвертации вы всегда можете выйти из строя и использовать библиотеку C cstdlib.

#include <cstlib>
#include <iostream>

int main()
{
   std::string num;

   std::cin >> num;

   someFunc(atoi(num));
   someOtherFunc(atof(num));
   return 0;
}

atoi = ascii to integer atof = ascii to float

Что касается поиска, используйте функцию STL " find ", определенную по алгоритму заголовка, или find_first_of (или аналогичный). Я также считаю, что вы можете инициализировать вектор символов с помощью std :: string, но это гипотеза.

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