Size: a a a

Compiler Development

2020 December 01

h

hazer_hazer in Compiler Development
hazer_hazer
За плюсы не шарите? просто substr или string(begin(), end()) — O(N)
Как можно сделать O(1)?
Не хотелось бы голый Си в плюсах использовать. Но если я правильно понимаю, char * index и "нужная мне стринга" при сравнении через strcmp O(1)?
источник

h

hazer_hazer in Compiler Development
hazer_hazer
Не хотелось бы голый Си в плюсах использовать. Но если я правильно понимаю, char * index и "нужная мне стринга" при сравнении через strcmp O(1)?
А не. Я туплю. Очевидно, что O(N) или меньше((
источник

h

hazer_hazer in Compiler Development
Не понимаю, как можно стринги сравнивать быстрее O(N)?
Хэш функции? Может в хэш-таблицы значения добавлять?
источник

K

Kir in Compiler Development
hazer_hazer
За плюсы не шарите? просто substr или string(begin(), end()) — O(N)
Как можно сделать O(1)?
Доступ, не substr
источник

h

hazer_hazer in Compiler Development
Kir
Доступ, не substr
Так доступ = "Весь текст" -> взять одну часть по индексу и длине.
Разве не субстринга здесь?
источник

K

Kir in Compiler Development
hazer_hazer
Не хотелось бы голый Си в плюсах использовать. Но если я правильно понимаю, char * index и "нужная мне стринга" при сравнении через strcmp O(1)?
У UTF-8 буквы потенциально разной длины, до 5 байт, вроде, так что просто str[i] а-ля C не прокатит, придётся с начала строки перебирать
источник

K

Kir in Compiler Development
Строка (в нормальном языке программирования) - это не char []
источник

K

Kir in Compiler Development
Если только внутренний формат не UTF32
источник

h

hazer_hazer in Compiler Development
Kir
У UTF-8 буквы потенциально разной длины, до 5 байт, вроде, так что просто str[i] а-ля C не прокатит, придётся с начала строки перебирать
А если wchar_t использовать и просто места больше тратить. Но проход будет по ним, а не по чарам?
источник

K

Kir in Compiler Development
char * index

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

wchar_t - это 16 бит, надо 32, который tchar_t. Я рекомендую взять готовую реализацию юникода откуда-нибудь (желательно UTF32)
источник

AM

Andrew Mikhaylov in Compiler Development
hazer_hazer
За плюсы не шарите? просто substr или string(begin(), end()) — O(N)
Как можно сделать O(1)?
Ответ на прямой вопрос выше тут уже упоминали -- std::string_view, C++17, https://en.cppreference.com/w/cpp/string/basic_string_view
Но по юникоду верные замечания выше.
источник

K

Kir in Compiler Development
Хотяяя, это не спасёт, ведь есть символы-манипуляторы, см https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags пример использования в первом ответе
источник

K

Kir in Compiler Development
Всё равно будет O(N). Так что лучше, на самом деле, взять готовое решение для UTF-8
источник

K

Kir in Compiler Development
У раста, кажется, либа для поддержки юникода макросами выкачивает стандарт, парсит его и генерит из него код
источник

K

Kir in Compiler Development
И я по-прежнему рекомендую языки семейства ML - SML/Ocaml/Haskell, особенно для компиляторов
источник

YS

Yaroslav Schekin in Compiler Development
Kir
У UTF-8 буквы потенциально разной длины, до 5 байт, вроде, так что просто str[i] а-ля C не прокатит, придётся с начала строки перебирать
Эээ... зачем? Разве хранить адрес / указатель на начало лексемы (т.е. первый байт) и её длину (в байтах или символах) недостаточно для O(1)?
Лексема-то "посреди" символа начинаться не будет, я надеюсь.
источник

А⚙

Антон ⚙️ in Compiler Development
Kir
К которому доступ за O(1), а не O(N)
А теперь скажи мне, зачем тебе O(1) доступ к code point-ам
источник

h

hazer_hazer in Compiler Development
Kir
char * index

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

wchar_t - это 16 бит, надо 32, который tchar_t. Я рекомендую взять готовую реализацию юникода откуда-нибудь (желательно UTF32)
Да. Си я и хочу избежать.

Понимаю, что если сразу заморочиться с utf, то потом придется меньше переписывать.

Но я лучше отложу это на время. Хотя бы прототип нужно минимальный сделать
источник

А⚙

Антон ⚙️ in Compiler Development
hazer_hazer
Да. Си я и хочу избежать.

Понимаю, что если сразу заморочиться с utf, то потом придется меньше переписывать.

Но я лучше отложу это на время. Хотя бы прототип нужно минимальный сделать
А на чём прототип?
источник

h

hazer_hazer in Compiler Development
Антон ⚙️
А на чём прототип?
Плюсы
источник