Крылатый
А можно текстом кол?
Крылатый
код*
Крылатый
А то с картинки неудобно жуть.
Micktu 😬
да, сейчас
Micktu 😬
str_t lb_to_lit(const str_t &in)
{
str_t out(2 * in.length(), '\0');
size_t i = 0;
for (char c : in)
{
if (c == '\r') continue;
if (c == '\n')
{
out[i++] = '\\';
out[i++] = 'n';
continue;
}
out[i++] = c;
}
out.resize(i);
return out;
}
Крылатый
Спасибо.
🦥Alex Fails
Просьба всем: не пишите кучу сообщений. Пишите в одном. В крайнем случае можно пропатчить свое сообщение
Micktu 😬
Micktu 😬
меня сильно портит общение со школьниками
🦥Alex Fails
Да оно портит весь интернет, он от него тупеет
Artem
ты же не любишь инкремент. Почему не пишешь out[i] = '\\'; i += 1;?
babysitter
Micktu 😬
Micktu 😬
потому что если есть, то почему бы нет :)
Artem
Micktu 😬
а вот наоборот. немного отличается
Micktu 😬
str_t lit_to_lb(const str_t &in)
{
str_t out(in.length(), '\0');
size_t i = 0;
for (auto it = in.begin(); it != in.end(); ++it)
{
if (*it != '\\' || *(it + 1) != 'n')
{
out[i++] = *it;
continue;
}
out[i++] = '\r';
out[i++] = '\n';
it++;
}
return out;
}
Micktu 😬
я не проверяю на (it + 1) == in.end(), потому что там нуль-сепаратор, duh
Micktu 😬
тоже годится
Micktu 😬
щас еще один алгоритм на замену регекса напишу
Evgenii
Почему бы не сделать один switch вместо того чтобы городить ифы?
Micktu 😬
потому что ифов мало и это лаконично и быстро
Micktu 😬
свитч более громозкий
Micktu 😬
Micktu 😬
большую часть проц. времени жрут два регекса
Micktu 😬
а не мой код и не дисковые операции
Micktu 😬
Micktu 😬
Micktu 😬
я заменю это на мэп
Micktu 😬
вместо статических полей, они мне не всрались
Крылатый
Тупой вариант влоб
Крылатый
str_t lb_to_lit(const str_t& in) {
str_t out;
out.reserve(2 * in.length());
auto func = [&out](const str_t::value_type value) {
switch(value) {
'\n': {
out.push_back('\\');
out.push_back('n');
break;
}
'\r': {
out.push_back('\0');
break;
}
default: {
out.push_back(value);
}
};
};
for_each(begin(in), end(in), func);
out.resize();
return out;
}
Micktu 😬
ужасно
Micktu 😬
))
Micktu 😬
мало того что хрен прочьешь
Micktu 😬
медленно
Micktu 😬
и out.push_back('\0') не всрался
Micktu 😬
там просто брейк
Micktu 😬
и out.reserve(2 * in.length()); не будет работать
Micktu 😬
хотя я ща сам проверю
Крылатый
Я не проверял на собираемость.
Micktu 😬
никогда не пробовал ресайз без параметров.
Micktu 😬
резерв определенно был бы лучше инициализации... просто у меня была проблема с комбо reserve-resize
Micktu 😬
он по каким-то соображениям зануливает все что между педыдущим сайзом (а он 0) и новым
Micktu 😬
ща проверю.
cyber
switch без case?
Крылатый
Говорю же, тяп-ляп писал)
Micktu 😬
ресайза без параметров не существует
Micktu 😬
так что увы ваариант с резервом не прокатит
Micktu 😬
серьезно, я за голову уже хватался с этим
Micktu 😬
пытался сдеалть то же самое но нет, строку ОБЯЗАТЕЛЬНо инициализировать. нельзя просто зарезервироваь, заполнить и ресайзнуть
Micktu 😬
я думаю там логика "если предыдущий размер меньше нового, обнулить память в этом промежутке"
Micktu 😬
так вот он затирает то, что ты в резерв записал
Крылатый
Можно в векторе херачить.
Micktu 😬
угу, можно
Micktu 😬
но
Крылатый
И потом строить струку по нему.
Micktu 😬
там тоже самое поведение :)))))))))
Крылатый
строку*
Micktu 😬
тоже нельзя ресерв ресайз.
Крылатый
Эээ.
Крылатый
Ну можно ещё хранить аргументом число символов.
Крылатый
И ресайзить опосля.
Micktu 😬
я не знаю теории, но пытался дслеать это оптимально разными способами, и строка и вектор страдают одной и тое же херней
Micktu 😬
инициализируют память при увеличении размера
Micktu 😬
стирают все
Micktu 😬
поэтому я сразу делаю инициализацию
Micktu 😬
тут не сэкономишь...
cyber
чего вы хоитте добиться?
Крылатый
Оптимально и функционально)
cyber
это, мне кажется, антонимы для многих алгоритмов
Крылатый
А, мой пример ещё и некорректный.
Micktu 😬
Micktu 😬
я просто написал самое оптимальное что мог придумать, Пегас подтянулся со своей версией
Micktu 😬
правда не совсем самое оптимальное. надо развернуть логику условий, потому что отрицание встречается чаще
Micktu 😬
так что начать с != \r, != n
Micktu 😬
потом иф == \n
Micktu 😬
и все