LINUX.ORG.RU

А как комфортно работать со строками в современном C++?

 , ,


0

8

Привет, ЛОР.

Старый добрый std::string, как мы знаем, это по сути char* на стероидах. А во многих случаях надо работать со строками именно как со строками текста.

К примеру, в библиотеке QtCore, входящей во фреймворк Qt, есть класс QString. Её часто ругают за изобретение велосипедов. Но именно благодаря этой «фабрике велосипедов» я могу написать, например, так:

QString s;
QStringList sl;
...
if (sl.contains(s, Qt::CaseInsensitive)) {
    ...
}

И оно мне проверит наличие строки в списке, причём регистронечувствительным (второй параметр) способом. И не только для латинских символов. То есть если в списке есть «Капибара», в строке подойдёт как «Капибара», так и «капибара». Ещё есть split(), join() и дофига полезного.

А как такое сделать без QtCore, на голом STL? В C++20 появился некий std::u8string, он мне поможет, например?

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

Так ты же известный чушенос который мне в прошлый раз доказывал что можно строку человеческого текста в utf32 индексировать как ASCII.

В коде есть #ifdef WX, #else if WINDOWS и #else Not implemented.

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

А ещё в коде есть ZENLIB_USEWX, гуру ты наш.
И пожалуйста, никогда мне больше не отвечай, все твои сообщения блюрятся скриптом.

dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

лучший путь это от ассемблера к высокоуровневым языкам, потому что низкоуровневые опираются на ассемблер и процессорные детали, высокоуровневые опираются на низкоуровневые концепции

ассемблеры на этом пути если не лишние, то необязательные

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

Почему? Я считаю очень многие вещи из С будет проще понять через знание ассемблера. И можно всегда посмотреть на godbolt как раскрывается незнакомая конструкция из С в ассемблере. Будет уже известно что такое стек, статическое хранилище, segfault.

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

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

А теперь оказывается, надо еще глубже закапываться по той же причине.

Ппц. Хочу нормальное систематическое базовое образование.

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

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

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

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

Тяжкая это задача, нести правду в мир.

Прямая ссылка на пример с Not implemented: https://github.com/MediaArea/ZenLib/blob/master/Source/ZenLib/Ztring.cpp#L1582

Тоже будешь отрицать, как и в предыдущий раз с utf32?

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

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

Короче. Все по порядку. Сначала завершу одно, начну другое.

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

Будет уже известно что такое … segfault.

На тех платформах, где они есть, это особенность самой платформы, а не ассемблера.

Чтобы изучать core dump’ы нужен отладчик, а не ассемблер.

ld  -b binary /dev/stdin <<< LOR ; strace ./a.out
ld: warning: cannot find entry symbol _start; not setting start address
execve("./a.out", ["./a.out"], 0x7ffff2b260f0 /* 15 vars */) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)
vM ★★
()
Ответ на: комментарий от vM

На тех платформах, где они есть, это особенность самой платформы, а не ассемблера.

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

Чтобы изучать core dump’ы нужен отладчик, а не ассемблер.

Отладчик тоже знать полезно, ну это отдельная тема. Я скорее про причины появления segfault на низком уровне, что такое страницы, какие права доступа можно установить.

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

Может есть руководство где работа с текстом более подробно описывается?

Не знаю, я не знаток QT. :)

У Qt есть методы где можно напрямую передавать локаль.

Это какие например?

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

Это какие например?

Можно создавать локали и передавать им строки для toUpper: QLocale::toUpper()

Можно создавать QCollator с определенной локалью и сравнивать строки: QCollator(QLocale)::compare()

MOPKOBKA ★★★★★
()