LINUX.ORG.RU

[неосилятор][C++]Библиотека для работы со строками

 ,


0

0

Требуется библиотека, которая предоставляет класс строки похожий на QString в Qt. Основные требования:

1)Кроссплатформенность (gcc, mingw, msvc)

2)Внутренняя кодировка для хранения строк - utf8 + поддержка конвертирования в ucs-4, std::wstring, локальная кодировка.

3)Аналоги sprintf и операторы сравнения, +

Пробовал сделать велосипед сам на libiconv, он даже работал на gcc и mingw, но c++ майкрософта оказался круче моего и деструктор строки вызывался дважды...

Можно конечно использовать QtCore но это слишком толсто....

★★★★

Ответ на: комментарий от yoghurt

Сам в шоке.

в винде std::wstring - ucs2 в линуксе - ucs4. + нужен быстрый доступ к utf8.

Прийдется наверное плясать с бубном вокруг msvc...

Kosyak ★★★★
() автор топика

Попробуй ICU, как обычно: http://icu-project.org. Не менее толсто, чем QtCore, но можно лишнее выкинуть перед сборкой. Да, классец для строк там хранит все в UTF-16, как и QString.

mannaz
()

Почему использовать QtCore это толсто, а плясать вокруг MSVC это нормально? Кто тут писал про кросплатформенность?:)

golodranez ★★★★
()

char * + функции glib. Если очень надо, то можно самому обернуть в классы, но не вижу в этом смысла.

Reset ★★★★★
()
Ответ на: комментарий от Legioner

>operator[] нужен редко, обычно нужен итератор.

В принципе согласен, но, предполагаю, что в реальном уже существующем коде общая статистика не в пользу итераторов.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

В реальном коде будет что то вида

for (int i = 0; i < str.length; ++i) {
  str[i] ...
}

Такой use-case решается кешированием последнего индекса, и сложность останется O(1).

Legioner ★★★★★
()
Ответ на: комментарий от LamerOk

почему? в utf-8 1 символ занимает от 1 до 6 байтов. Для инкремента нужно сделать не более 6 шагов, в независимости от длины строки.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

"Не более" != "ровно".

O(1) - это константное время. Т.е. любое действие занимает одинаковое время. Если время варьируется в сколь угодно малом диапазоне f(n) - это будет уже O(f(n)), т.е. O(N).

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

> любое действие

действие на любых входных данных

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Нет. O(N) значит, что для любого входа длины N время работы алгоритма не более чем C*N (где C - некоторая константа). O(1) значит, что для любого входа длины N время работы алгоритма не более чем C.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

"На любых входных данных" - означает любые значения данных, а не любой их размер. В случае с доступом через str[i] входным значением является i.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.