Russian Qt Forum
Май 23, 2024, 21:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: qRegexReplace - аналог boost::regex_replace  (Прочитано 17374 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #15 : Январь 10, 2017, 14:55 »

Цитировать
Т.е. для вашего объема было выполнено 28 переаллокаций.
Нет, я думаю, гораздо меньше.. В результирующую строку ведь идёт не посимвольная запись, а целыми кусками текста. И кусков таким порядка N штук, где N - число заменяемых фрагментов..  

Цитировать
Ещё бы spirit под Qt онли  Улыбающийся  Улыбающийся
Аха, spirit им ещё подавай  Улыбающийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #16 : Январь 10, 2017, 14:57 »

Нет, я думаю, гораздо меньше.. В результирующую строку ведь идёт не посимвольная запись, а целыми кусками текста. И кусков таким порядка N штук, где N - число заменяемых фрагментов..  
Да, 28 переалокаций было бы при посимвольном дополнении.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #17 : Январь 10, 2017, 14:58 »

Аха, spirit им ещё подавай  Улыбающийся
Даёшь Qoost!
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #18 : Январь 10, 2017, 15:06 »

Цитировать
Даёшь Qoost!
Смеющийся Пссс.. /* шёпотом  */ Вы такими призывами некоторых товарищей до инфаркта доведёте..  Смеющийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Январь 10, 2017, 15:16 »

QString qRegexReplace(const QString& text, const QMap<QString,QString>& replaceMap) const

и пользователь больше не имеет понятия ни о каком регэксп - оно меняет ключи на значения, а как - вопрос имплементации.
Не, ну так нет гибкости, к тому же если никакого регэксп нет, то зачем его поминать в имени ф-ции? Cимпатичнее напр так
Код
C++ (Qt)
template <class TRepl>
QString qCustomReplace( const QString& text, TRepl repl );
 
Пример реализации функтора
Код
C++ (Qt)
inline QStringRef OffsetRef( QStringRef & ref, int offs  )
{
return QStringRef(ref.string(), ref.position() + offs, ref.length() - offs);
}
 
QStringRef MyRepl( QStringRef & ref )
{
const int count = 2;
typedef QPair<QString, QString> TPair;
static const TPair data[count] = {
   TPair("$user", "terminator"),
   TPair("$version", "T1000")
};
 
// if (ref[0] != '$')  return QStringRef();  // возможная оптимизация
 
for (int i = 0; i < count; ++i)
  if (ref.startsWith(data[i].first)) {
   ref = OffsetRef(ref, data[i].first.size());
   return QStringRef(&data[i].second);
}
 
return QStringRef();   // пустая ссылка - замены не было (переход на след символ)
}
А для типового варианта с мапой запастись хвунктором-классом с конструктором принимающим напр ссылку на мапу

Нет, я просто перенёс идею, реализованную в boostе в Qt мир) Потому что в Qt из коробки такого решения нет, а тема, по видимому, актуальна для новичков) Вот и всё..
До этой идеи можно сэволюционировать и без буста  Улыбающийся

Да, я понимаю, что она не на каждый чих будет выделять новый блок, но всё же..
Сейчас попробую построить для наглядности график как ведёт себя capacity.. Моментик..)  
Не стоит впадать в крайность, достаточно "боковым зрением" присматривать за числом malloc. Напр код выше можно запустить в 2 прохода, чтобы предвычислить длину рез-та, но по-моему это уже перегиб
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #20 : Январь 10, 2017, 16:00 »

Цитировать
Cимпатичнее напр так
Да, и заставлять пользователя брать на себя ответственность за разбор (в функторе) - опять проверять, отлаживаться и т.д.. А если завтра ситуация по сложней окажется?
Нет уж)

Цитировать
Напр код выше можно запустить в 2 прохода, чтобы предвычислить длину рез-та, но по-моему это уже перегиб
Да, согласен, перегиб.. 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Январь 10, 2017, 16:19 »

Да, и заставлять пользователя брать на себя ответственность за разбор (в функторе) - опять проверять, отлаживаться и т.д.. А если завтра ситуация по сложней окажется?
Нет уж)
Так это так или иначе неизбежно - только он и знает правила замены, обобщать их в общем случае бесполезно. Просто здесь он избавлен от забот со "склейкой" выходной строки -  что очень неплохо
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #22 : Январь 10, 2017, 16:33 »

Cимпатичнее напр так
Код
C++ (Qt)
template <class TRepl>
QString qCustomReplace( const QString& text, TRepl repl );
 
А что же так симпатично упрощает qCustomReplace для пользователя, если ему все равно приходиться каждый раз кодировать и поиск, и замену, в общем все? Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #23 : Январь 10, 2017, 17:16 »

Примерно про std::vector. Лень по новой проверять, но было, кажется не 1024, а что-то около 1028.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #24 : Январь 10, 2017, 17:40 »

Вот пару ссылочек в тему...

https://en.wikipedia.org/wiki/Overengineering

https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #25 : Январь 10, 2017, 18:08 »

Вот пару ссылочек в тему...
У нас другая крайность. Улыбающийся
Мы докатились до функции, которая ничего не делает. Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #26 : Январь 11, 2017, 13:30 »

Цитировать
Я бы API примерно так видел:

QString qRegexReplace(const QString& text, const QMap<QString,QString>& replaceMap) const
Окей, как Вы тогда решите такую проблему: http://www.prog.org.ru/topic_30197_0.html
Ммм?  Улыбающийся


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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.106 секунд. Запросов: 23.