Russian Qt Forum

Qt => Общие вопросы => Тема начата: xintrea от Июнь 05, 2016, 17:40



Название: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: xintrea от Июнь 05, 2016, 17:40
Есть многострочный HTML-текст (по сути, валидный XML), в котором могут встречаться такие конструкции:

Код:
<span разные_атрибуты>  </span>
<span разные_атрибуты>    </span>
<span разные_атрибуты> </span>


Да, это именно "пробельный" текст с разным количеством пробелов.

Задача: заменить все такие вхождения на такие:

Код:
<span разные_атрибуты>&#65533;&#65533;</span>
<span разные_атрибуты>&#65533;&#65533;&#65533;&#65533;</span>
<span разные_атрибуты>&#65533;</span>


В других местах HTML-кода заменять пробелы на "&#65533;" не требуется.

Обрабатывать нужно именно регулярными выражениями. Потому что, например, парсинг в DOM (с последующим обратным преобразованием) не сделает текстовую ноду из одних пробелов внутри ноды span.

Вопрос: как это сделать регулярками? Вот заготовка:

Код:
QRegExp replaceSpaceTagsEx("<span.*>(\\s*)</span>");
replaceSpaceTagsEx.setMinimal(true);
htmlCode.replace(replaceSpaceTagsEx, "?????");


Что надо прописать вместо знаков вопроса? Или надо делать как-то по-другому?


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 05, 2016, 18:17
Boost::xpressive может такое делать) Можно использовать его, а можно и свой велосипед написать, подсмотрев как это сделано там (в xpressive).
Фактически нужно написать свою функцию, аналог http://www.boost.org/doc/libs/1_61_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions (http://www.boost.org/doc/libs/1_61_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions):
Код
C++ (Qt)
QString regex_replace(const QString & input, const RegExp & regex, const std::function<QString(const QString &)> & format_func);
 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: xintrea от Июнь 05, 2016, 19:30
Boost::xpressive может такое делать) Можно использовать его, а можно и свой велосипед написать, подсмотрев как это сделано там (в xpressive).
Фактически нужно написать свою функцию, аналог http://www.boost.org/doc/libs/1_61_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions (http://www.boost.org/doc/libs/1_61_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions):
Код
C++ (Qt)
QString regex_replace(const QString & input, const RegExp & regex, const std::function<QString(const QString &)> & format_func);
 

Как-то это слишком сложно для такой простой задачи.

А Boost я не смогу воспользоваться потому что концепт разрабатываемой программы - Qt-only.

Есть что-нибудь подубовее и попроще?


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 05, 2016, 23:33
Цитировать
Как-то это слишком сложно для такой простой задачи.
Вот для более гибкого буста это действительно, простая задача) А для Qt простого решения, похоже нет (могу ошибаться)
Я вот что примерно предлагал
Код
C++ (Qt)
template <class FormatFunc>
QString regex_replace(const QString & input, const QRegExp & regex, FormatFunc format_func)
{
   int pos = 0;
   QStringList list;
   QList<QPair<int, int>> ranges;
 
   while ((pos = regex.indexIn(input, pos)) != -1)
   {
       ranges << qMakePair(regex.pos(1), regex.pos(1) + regex.cap(1).size());
       list << format_func(regex.cap(1));
       pos += regex.matchedLength();
   }
 
   int space_count = 0;
   int rep_space_count = 0;
   auto it = list.begin();
   for (auto & r : ranges)
   {
       space_count += r.second - r.first;
       rep_space_count += it->size();
   }
 
   QString out;
   out.reserve(input.size() - space_count + rep_space_count);
 
   it = list.begin();
   pos = 0;
 
   for (auto & r : ranges)
   {
       out.append(QStringRef(&input, pos, r.first-pos));
       out.append(*it++);
       pos = r.second;
   }
   out.append(QStringRef(&input, pos, input.size()-pos));
 
   return out;
}
 
int main()
{
   QString str = "<span>  </span> text text text <span> </span> text TeXt <span>         </span>bla-bla-bla";
 
   QRegExp rx("<span.*>(\\s*)</span>");
   rx.setMinimal(true);
 
   qDebug() << regex_replace(str, rx, [](const QString & str)->QString
   {
       QString rep = "&#38;#65533;";
 
       return  rep.repeated(str.size());
   });
 
   return 0;
}
 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 06, 2016, 06:45
Эх, напишу-ка я файнд-реплейс :)
Код
C++ (Qt)
#include <QtWidgets>
 
typedef QPair<int, int> TPair;
typedef QVector<TPair> TVec;
 
TVec CollectPairs( const QString & src, const QString & begStr, const QString & endStr )
{
TVec dst;
int pos = 0;
while (true) {
int beg = src.indexOf(begStr, pos);
if (beg < 0) return dst;
int pos2 = pos = beg + begStr.size();
 
int end = src.indexOf(endStr, pos);
if (end < 0) return dst;
pos = end + endStr.size();
 
for (int mid = end - 1; mid >= pos2; --mid) {
if (src[mid] == ' ') continue;
if (src[mid] == '>')
dst.push_back(TPair(mid + 1, end));
break;
}
}
return dst;
}
 
QString ReplaceBlanks( const QString & src )
{
QString dst;
const QString & spaceTxt("&#38;#65533;");
int srcPos = 0;
TVec vec = CollectPairs(src, "<span", "</span>");
for (int i = 0; i < vec.size(); ++i) {
int beg = vec[i].first;
int end = vec[i].second;
dst += QStringRef(&src, srcPos, beg - srcPos);
for (int j = beg; j < end; ++j)
dst += spaceTxt;
srcPos = end;
}
 
dst += QStringRef(&src, srcPos, src.size() - srcPos);
return dst;
}
 
int main(int argc, char *argv[])
{
const char * testStr =
"<span разные_атрибуты>  </span>\n"
"<span разные_атрибуты>    </span>\n"
"<span разные_атрибуты> </span>";
 
qDebug() << ReplaceBlanks(testStr);
return 0;
}
 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: zavitaliy от Июнь 06, 2016, 09:52
Простой вариант без функций

Код:
    QString test = "<span разные_атрибуты>  </span>"
                   "<span разные_атрибуты>    </span>"
                   "<span разные_атрибуты> </span>";

    QRegExp rx = QRegExp("(<span.*>)(\\s*)(</span>)");
    rx.setMinimal(true);
    int pos = 0;
    while ( (pos=rx.indexIn(test,pos)) != -1) {
        QString tmp = QString("&#65533;").repeated( rx.cap( 2 ).length() );
        test.replace( pos,
                      rx.matchedLength(),
                      rx.cap(1) + tmp + rx.cap(3)
                      );
        pos += rx.matchedLength() + tmp.length() - rx.cap( 2 ).length();
    }

    qDebug().noquote() << test;


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 06, 2016, 10:48
Цитировать
Эх, напишу-ка я файнд-реплейс  :)
Аха, аха) А потом ещё с десяток штук: вдруг ТСу завтра что-нить другое на что-нить третье придётся заменять?)

Цитировать
Простой вариант без функций

Так категорически нельзя делать..(


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 06, 2016, 16:51
Аха, аха) А потом ещё с десяток штук: вдруг ТСу завтра что-нить другое на что-нить третье придётся заменять?)
А у Вас, стало быть, уже все "обобщено"?  :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: GreatSnake от Июнь 06, 2016, 17:14
Я вот что примерно предлагал
А зачем так усложнять, если можно так
Код
C++ (Qt)
template <class FormatFunc>
QString regex_replace(const QString & input, const QRegExp & regex, FormatFunc format_func)
{
   QString out = input;
   int pos = 0;
   while ((pos = regex.indexIn(out, pos)) != -1)
   {
       auto s = format_func(regex.cap(1));
       out.replace( pos, regex.matchedLength(), s );
pos += s.length();
   }
   return out;
}


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 06, 2016, 18:30
Цитировать
А у Вас, стало быть, уже все "обобщено"?   :)
Не всё, но гибче) Завтра ТСу понадобиться вместо тегов span что то другое.. Мне достаточно переписать регулярку, Вам лезть в обе функции.. Завтра ТСу потребуется в зависимости от того, что имено нах. между тегов заменять содержимое по какому-либо критерию: мне для этого нужно будет подкорректировать лямбду, а Вам?)

Цитировать
А зачем так усложнять, если можно так
Из-за вот этого репласе при каждом чихе:
Код
C++ (Qt)
out.replace( pos, regex.matchedLength(), s );
 
И потом, в общем случае, при этом варианте значение pos будет разным у оригинала и у out.. А это чревато..


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: GreatSnake от Июнь 07, 2016, 10:59
Из-за вот этого репласе при каждом чихе:
И что в этом криминального?
Цитировать
И потом, в общем случае, при этом варианте значение pos будет разным у оригинала и у out.. А это чревато..
Нет, не будет, т.к. при парсинге используется только out, что совершенно не чревато  ;)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 07, 2016, 11:18
Из-за вот этого репласе при каждом чихе:
И что в этом криминального?
Жирная она просто, эта репласе.. Если файл большой будет и придётся часто делать replace - то этот фрагмент может быстро стать узким местом..


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 07, 2016, 11:46
И что в этом криминального?
Ну то что вся строка (потенциально большая) копируется всякий раз

Нет, не будет, т.к. при парсинге используется только out, что совершенно не чревато  ;)
Все-таки так Вы ставите pos на начало "завершающего" (</span>) что неточно (в общем случае он может быть равен "стартовому").

Вообще как-то "довлеет" стремление "написать как можно короче" :) В данном случае оно того не стоит, можно обойтись самыми примитивными средствами, и даже не знать "регулярки". Ну будет чуть больше строк, зато нагрузка на (слабеющий) моск меньше. "Короче" не значит "проще", обычно наоборот

Не всё, но гибче) Завтра ТСу понадобиться вместо тегов span что то другое.. Мне достаточно переписать регулярку, Вам лезть в обе функции.. Завтра ТСу потребуется в зависимости от того, что имено нах. между тегов заменять содержимое по какому-либо критерию: мне для этого нужно будет подкорректировать лямбду, а Вам?)
Может быть, но совершенно необязательно. А возможно за следующие полгода ни одной новой замены не возникнет вообще. Ну хорошо, допустим через год "опять", что бы я делал? Постарался  бы вспомнить свой старый текст. Если он прост - сделать это намного легче. Потом подумал что можно сделать лучше. Напр собирать все "пары" в контейнер - наверное ни к чему, лучше делать одним while. Возможно стоит сделать нормальный класс, напр
Код
C++ (Qt)
struct CReplacer {
CReplacer( const QString & src );
virtual bool Find( QStringRef & ref ) const;
virtual QString Replace( const QStringRef & ref ) const;
..
};
Но может и нет, если это опять "мелкий эпизод", то выделил ф-цию, закинул ее в утили, а остальное скопировал. В общем, как говорит народная мудрость
Цитировать
Тише едешь - дальше будешь
:)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 07, 2016, 13:21
Адище какое :)
Находим через регексп текст внутри спана. Только В НАЙДЕННОМ ДИАПАЗОНЕ заменяем пробелы. Повторяем поиск с позиции конца заменененного диапазона.
Профит.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: GreatSnake от Июнь 07, 2016, 13:57
Ну то что вся строка (потенциально большая) копируется всякий раз
Согласен, можно и не копировать, только ремарка была не к этому.

Цитировать
Все-таки так Вы ставите pos на начало "завершающего" (</span>) что неточно (в общем случае он может быть равен "стартовому")
С чего это? Никакого "завершающего" (</span>) там уже не будет. Внимательно смотрим код.

Цитировать
Вообще как-то "довлеет" стремление "написать как можно короче" :) В данном случае оно того не стоит, можно обойтись самыми примитивными средствами, и даже не знать "регулярки". Ну будет чуть больше строк, зато нагрузка на (слабеющий) моск меньше. "Короче" не значит "проще", обычно наоборот
Для данного случае проще и короче уже некуда.

Адище какое :)
Находим через регексп текст внутри спана. Только В НАЙДЕННОМ ДИАПАЗОНЕ заменяем пробелы. Повторяем поиск с позиции конца заменененного диапазона.
Профит.
+1


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 07, 2016, 14:58
С чего это? Никакого "завершающего" (</span>) там уже не будет. Внимательно смотрим код.
Давайте посмотрим
Код
C++ (Qt)
template <class FormatFunc>
QString regex_replace(const QString & input, const QRegExp & regex, FormatFunc format_func)
{
   QString out = input;
   int pos = 0;
   while ((pos = regex.indexIn(out, pos)) != -1)
   {
       auto s = format_func(regex.cap(1));
       out.replace( pos, regex.matchedLength(), s );
pos += s.length();
   }
   return out;
}
В момент out.replace: pos стоит на первом пробеле для замены (в строке out). Потом Вы добавляете длину строки-замены, в итоге pos стоит на начале хвостика </span>. Что не так?

Адище какое :)
Находим через регексп текст внутри спана. Только В НАЙДЕННОМ ДИАПАЗОНЕ заменяем пробелы. Повторяем поиск с позиции конца заменененного диапазона.
Профит.
С "идеологией" никто не спорит :) Вот только как это технически исполнить?


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 07, 2016, 15:07
QRegExp::indexIn - дает нам начало текста.
QRegExp::matchedLength() - дает нам длину текста.
Полученный текст подвергаем replace, и вставляем его в оригинал.
Зная, на сколько поменялась длина нового текста, сдвигаем оффсет регэкспа и повторяем поиск.
Код писать влом, но по моему, задача примитивная :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: GreatSnake от Июнь 07, 2016, 15:20
Потом Вы добавляете длину строки-замены, в итоге pos стоит на начале хвостика </span>. Что не так?
QRegExp::matchedLength() даёт длину всего вхождения, т.е. <span>....</span>, поэтому после замены этого вхождения в out уже не будет.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 07, 2016, 16:17
Адище какое :)
Находим через регексп текст внутри спана. Только В НАЙДЕННОМ ДИАПАЗОНЕ заменяем пробелы. Повторяем поиск с позиции конца заменененного диапазона.
Профит.
Вы тоже реплэйсом их заменять предлагаете?)  

Кстатии:
Эх, напишу-ка я файнд-реплейс :)
Код
C++ (Qt)
...
QString ReplaceBlanks( const QString & src )
{
QString dst;
const QString & spaceTxt("&#38;#65533;");
int srcPos = 0;
TVec vec = CollectPairs(src, "<span", "</span>");
for (int i = 0; i < vec.size(); ++i) {
int beg = vec[i].first;
int end = vec[i].second;
dst += QStringRef(&src, srcPos, beg - srcPos);
for (int j = beg; j < end; ++j)
dst += spaceTxt;
srcPos = end;
}
 
dst += QStringRef(&src, srcPos, src.size() - srcPos);
return dst;
}
...
 
У Вас ведь тоже dst копируется постоянно:
Код
C++ (Qt)
dst += QStringRef(&src, srcPos, beg - srcPos);
...
dst += spaceTxt;
 
Нехорошо)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 07, 2016, 16:46
Адище какое :)
Находим через регексп текст внутри спана. Только В НАЙДЕННОМ ДИАПАЗОНЕ заменяем пробелы. Повторяем поиск с позиции конца заменененного диапазона.
Профит.

Вы тоже реплэйсом их заменять предлагаете?) 

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


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 07, 2016, 22:05
Цитировать
Думаю, в контексте данной задачи это непринципиально.
Угу, скажите это пользователям не нового железа с 512 MB ОЗУ на борту и 32-битной архитектурой, которым нужно обрабатывать файлы за 100MB)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 07, 2016, 22:59
Цитировать
Думаю, в контексте данной задачи это непринципиально.
Угу, скажите это пользователям не нового железа с 512 MB ОЗУ на борту и 32-битной архитектурой, которым нужно обрабатывать файлы за 100MB)

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


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 07, 2016, 23:48
Цитировать
Думаю, в контексте данной задачи это непринципиально.
Угу, скажите это пользователям не нового железа с 512 MB ОЗУ на борту и 32-битной архитектурой, которым нужно обрабатывать файлы за 100MB)

Ну, это уже больше вопрос имплементации конкретного реплейса, а не алгоритма в целом.
В принципе реплейс - довольно примитивная процедура с точки зрения реализации и может быть неплохо оптимизирована.
Так,.. и каие альтернативы реализации replace Вы видете? Хотя бы концептуально, в общем?


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 08, 2016, 01:23
Допустим, исходные данные у нас имеют длину L байт, заменяемый элемент S байт, целевой - R байт.
Тогда максимум памяти, необходимой для результата, составит (L / S) * R.
Далее, (подразумеваем тупой вариант - посимвольное сравнение и замену, без всяких там регистров и перекодировок), достаточно просканировать исходные данные на вхожения заменяемых элементов и побайтово скопировать их в результирующий массив. Т.е. найдено совпадение - пишем замененное значение в результат, не найдено - пишем исходный байт и переходим к следующему и т.д.
Не знаю, что еще тут можно придумать, т.к. задача действительно тривиальная и требует только одного прохода по исходному массиву.
Быстродействие в итоге зависит от реализации сравнения паттернов, но тут тоже задача "в лоб".
Не думаю, что "слабые машины" не потянут такое :)


 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 08, 2016, 07:08
QRegExp::matchedLength() даёт длину всего вхождения, т.е. <span>....</span>, поэтому после замены этого вхождения в out уже не будет.
Так ведь задача была менять не весь блок <span>....</span>, а только пробелы в нем. Ладно, не суть, но обратите внимание: я все время путаюсь в том "коротком и простом" (дальше некуда) что Вы написали :) И мои слабые способности - не единственное тому объяснение  :)

У Вас ведь тоже dst копируется постоянно:
Нет, в большинстве случаев срабатывает пул QString и никаких выделений памяти не происходит. А вот предрассчитывать нужный размер ценой создания QStringList - явный перебор

Так,.. и каие альтернативы реализации replace Вы видете? Хотя бы концептуально, в общем?
Ну чего уж останавливаться на полуслове? Продолжайте, типа "а вот boost::xxx умные люди давно уже все написали!!!". Может и так, но выворачиваться наизнанку с гребаными функторами и операторами как-то не хочется. "Концептуальность" не имеет ничего общего с заучиванием очередного кусочка готового. Вероятно Вы использовали это слово по ошибке (в дусте часто встречается "concept")   


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: poru от Июнь 08, 2016, 10:35
Обрабатывать нужно именно регулярными выражениями. Потому что, например, парсинг в DOM (с последующим обратным преобразованием) не сделает текстовую ноду из одних пробелов внутри ноды span.
Вот ключевая фраза всей темы. Дезинформация. Спецификация DOM не запрещает использовать пробелы (и только пробелы) в текстовых нодах. Обработка пробелов возлагается на пользователя, на его усмотрение.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 08, 2016, 11:34
Допустим, исходные данные у нас имеют длину L байт, заменяемый элемент S байт, целевой - R байт.
Тогда максимум памяти, необходимой для результата, составит (L / S) * R.
Далее, (подразумеваем тупой вариант - посимвольное сравнение и замену, без всяких там регистров и перекодировок), достаточно просканировать исходные данные на вхожения заменяемых элементов и побайтово скопировать их в результирующий массив. Т.е. найдено совпадение - пишем замененное значение в результат, не найдено - пишем исходный байт и переходим к следующему и т.д.
Не знаю, что еще тут можно придумать, т.к. задача действительно тривиальная и требует только одного прохода по исходному массиву.
Быстродействие в итоге зависит от реализации сравнения паттернов, но тут тоже задача "в лоб".
Не думаю, что "слабые машины" не потянут такое :)
Так я к тому, что если результирующий массив (его size) окажется больше изначального размера capacity, придётся аллоцировать под него новый кусок памяти,  ну и + скопировать из старого в новый. При частом вызове такого реплайсе это может привести к фрагментации памяти (особено на старом железе).

Цитировать
А вот предрассчитывать нужный размер ценой создания QStringList - явный перебор
А там QStringList не только для этого нужен. Я же писал, что это даёт мне возможность "на лету" в лямбде обрабатывать более сложные условия/случаи. Вам же для этого придётся писать новые функции..

Цитировать
Ну чего уж останавливаться на полуслове? Продолжайте, типа "а вот boost::xxx умные люди давно уже все написали!!!".
А что в этом плохого? Да, буст это инструмент, гибкий и отлично продуманный. Там можно подсмотреть не мало концептов и решений. И понимание и изучение их гораздо более полезнее для собственного развития, чем написания велосипедов в стиле C с классами. )
 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 08, 2016, 11:41
Так я к тому, что если результирующий массив (его size) окажется больше изначального размера capacity, придётся аллоцировать под него новый кусок памяти,  ну и + скопировать из старого в новый. При частом вызове такого реплайсе это может привести к фрагментации памяти (особено на старом железе).

Реаллокаций памяти тут в любом случае не избежать. Можно сделать более "хитро" и сначала подсчитать количество всех заменяемых объектов, аллоцировать память за один раз и вторым проходом выполнить замену - но тогда придётся расплачиваться быстродействием. Ну или же сразу выделить огромный буфер, заведомо покрываюший все нужны - но тогда платим памятью :)

Цитировать
А там QStringList не только для этого нужен. Я же писал, что это даёт мне возможность "на лету" в лямбде обрабатывать более сложные условия/случаи. Вам же для этого придётся писать новые функции..

"Лямбда" - это по сути тоже функия :) И Вам придется писать новые лямбды, от этого тоже никуда)

Цитировать
Да, буст это инструмент, гибкий и отлично продуманный.  

Насчет последних двух утверждений - я бы поспорил :)
Но поскольку это форум по Qt, наверняка народ ожидает решений в стиле Qt...


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 08, 2016, 11:56
Цитировать
"Лямбда" - это по сути тоже функия  :) И Вам придется писать новые лямбды, от этого тоже никуда)
Конечно, только лямбду пишет сам пользователь "на лету" в зависимости от его конкретной задачи. Как правило это будет лёгковесное изменение. Ему не нужно для этого писать заново всю regexp_replace. :) Тем самым с одной функцией он может решать разные задачи.

Цитировать
Но поскольку это форум по Qt, наверняка народ ожидает решений в стиле Qt...
Я понима, что форум по Qt, но зачем ограничиваться только лишь их ситилем? Всегда полезно обсудить и сравнить несколько различных подходов к решению задачи) Их синтез - двигатель прогресса)  





Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 08, 2016, 12:32
Вот, предположим, я поверил в непогрешимость буста :) И начал прикручивать regex_replace.
Ок, идем в доку (сюды http://www.boost.org/doc/libs/1_61_0/doc/html/boost/xpressive/regex_replace.html), смотрим...

template<typename OutIter, typename BidiIter, typename Formatter>
  OutIter regex_replace(OutIter out, BidiIter begin, BidiIter end,
                        basic_regex< BidiIter > const & re,
                        Formatter const & format,
                        regex_constants::match_flag_type flags = regex_constants::match_default,
                        unspecified = 0);

Ну ок, итераторы там (хотя на что? что есть входными и выходными параметрами для них? какой тип данных? какие контейнеры? Надо ли мне иметь уже преалоцированный контейнер для результатов или оно "само сделается"?)

Ладно, нашел вариант, который использует Char* str как инпут... Но вопрос, а где тогда output?? Ни примеров, ни описания...

Дальше,  basic_regex - по идее, тут я должен прописать свой РыгЭксп... Упираемся в такое: http://www.boost.org/doc/libs/1_61_0/doc/html/boost/xpressive/basic_regex.html

template<typename InputIter>
  static basic_regex< BidiIter >
  compile(InputIter begin, InputIter end,
          flag_type flags = regex_constants::ECMAScript);

Ок, рыгэксп надо задавать какими-то биде-итераторами... Ни примеров, ни-че-го :(

Идем дальше, нужен  Formatter const & format, который, судя по мелкому примечанию внизу, будет вызван после каждого поиска:

Otherwise, for each match found, if !(flags & format_no_copy) calls std::copy(m.prefix().first, m.prefix().second, out), and then calls m.format(out, format, flags).

То есть, оно таки берет и тупо копирует кусок памяти (с аллокациями и т.д.), а потом вызывает форматтер... Приехали к тому, что обсуждалось выше :(
 
Самое веселое - API данного форматера я так и не увидел, покажите...?


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 08, 2016, 13:32
Цитировать
Ну ок, итераторы там (хотя на что?
Это даёт Вам возможность адаптировать алгоритм для любого контейнера, который поддерживает bidirectional итераторы, т.е. такие, которые могут бегать по последовательности в обоих направлениях: http://en.cppreference.com/w/cpp/concept/BidirectionalIterator (http://en.cppreference.com/w/cpp/concept/BidirectionalIterator)

Цитировать
что есть входными и выходными параметрами для них?
OutIter out - входной итератор:
 BidiIter begin - начало исходной последовательности:
 BidiIter end - угадайте)

Цитировать
какой тип данных? какие контейнеры?
В том то всё и оно, что Вы можете использовать хоть std::string хоть std::vector<char>, хоть QString, хоть вообще левую реализацию Васи Пупкина. Главное чтоб последовательность поддерживала bidirectional итераторы.

Цитировать
Надо ли мне иметь уже преалоцированный контейнер для результатов или оно "само сделается"?)
 
Не уверен, надо почитать..

Цитировать
Ок, рыгэксп надо задавать какими-то биде-итераторами... Ни примеров, ни-че-го  :-[
 
Опять же, это сделано для того, чтобы Вы могли прикрутить регулярку для любой реализации строк.

Вот Вам простой пример использования (из гугла):
Код
C++ (Qt)
using boost::xpressive;
 
std::string modifyString(const smatch& match){
   std::string out(match[1]);
   std::reverse(out.begin(),out.end());
   return out;
}
 
 
   std::string in("a(bc) de(fg)");
   sregex re = +_w >> '(' >> (s1= +_w) >> ')';
   std::string out = regex_replace(in, re, modifyString);
   std::cout << out << std::endl;
 
 

Цитировать
То есть, оно таки берет и тупо копирует кусок памяти (с аллокациями и т.д.), а потом вызывает форматтер... Приехали к тому, что обсуждалось выше  :(
С чего Вы взяли, что алгоритм std::copy занимается аллоцированием? Он просто копирует одну последовательность: m.prefix().first, m.prefix().second в выходную out. http://en.cppreference.com/w/cpp/algorithm/copy (http://en.cppreference.com/w/cpp/algorithm/copy)

Цитировать
Самое веселое - API данного форматера я так и не увидел, покажите...?
Сигнатура форматера зависит от того, с какой последовательностью Вы работаете. Например для std::string:
Код
C++ (Qt)
std::string my_formatter(const smatch &)
 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 08, 2016, 14:31
А что в этом плохого? Да, буст это инструмент, гибкий и отлично продуманный. Там можно подсмотреть не мало концептов и решений. И понимание и изучение их гораздо более полезнее для собственного развития, чем написания велосипедов в стиле C с классами. )
Мои наблюдения за Вашим развитием (точнее регрессом) этих выводов о полезности не подтверждают :)

Свежий пример
Вот Вам простой пример использования (из гугла):
Код
C++ (Qt)
using boost::xpressive;
 
std::string modifyString(const smatch& match){
   std::string out(match[1]);
   std::reverse(out.begin(),out.end());
   return out;
}
 
 
   std::string in("a(bc) de(fg)");
   sregex re = +_w >> '(' >> (s1= +_w) >> ')';
   std::string out = regex_replace(in, re, modifyString);
   std::cout << out << std::endl;
 
 
Что человек извлекает из этого? Ну надо запомнить "+_w" и "s1", и, конечно, как вызывать. Потом у себя в тексте повторить. УСЕ. Какие нафиг "концепты"? Тупенькая запоминаловка рулит :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 08, 2016, 15:09
Вот сказу честно: как мне кажется, буст - это отличный пример оверинжиниринга и антипаттернов Gas factory и Soft code. Главная проблема буста - он не является проблемно-ориентированной библиотекой, а представляет из себя набор слабо связанных между собой модулей. То есть для того, чтобы РЕШИТЬ с его помощью определенную задачу, надо потратить битый час на то, чтобы разобраться с архитектурой и параметризацией. Действительно ли хочет этого заказчик? Или ему нужно решение проблемы наиболее эффективным способом?

Основной мой вопрос: оправдывает ли себя погружение в буст с т.з. производительности полученной программы? Насколько хороши заложенные в него решения для того, чтобы пренебречь читаемостью и пониманием кода?


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 08, 2016, 16:00
Вот сказу честно: как мне кажется, буст - это отличный пример оверинжиниринга и антипаттернов Gas factory и Soft code. Главная проблема буста - он не является проблемно-ориентированной библиотекой,
Ну вообще-то есть и др направления кроме ООП. Никогда не общались напр с поклонниками хаскеля (ФП - ф-циональное программирование)? О-ооо  :)

Основной мой вопрос: оправдывает ли себя погружение в буст с т.з. производительности полученной программы? Насколько хороши заложенные в него решения для того, чтобы пренебречь читаемостью и пониманием кода?
Вот кстати о последнем. Почему-то все промолчали, а мне бросилось в глаза
Код
C++ (Qt)
template <class FormatFunc>
QString regex_replace
Кто такой FormatFunc? Хз. Что принимает и что возвращает? Хз. Что он должен делать по замыслу автора? Хз. Все это надо выковыривать в коде по крупицам. Якобы "для достижения большей гибкости". А по-моему простецкий коллбэк
Код
C++ (Qt)
typedef QString (*ReplaceFunc)( const QRegExp &);  // c QRegExp
// или
typedef QString (*ReplaceFunc)( const QStringRef & ref );  // без QRegExp
 
был бы и яснее и мощнее. Ах, это не будет работать с std::string и.т.п.!!! ("морковка общности" суется в нос). Да пофиг ветер, придет задача с std::string - тогда и будем думать, и решения найдутся получше таких трудоемких как "все только общее".

Да, и где здесь "концепции"? Повторение увиденной схемы без единой своей мысли - и то технически неудачное.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 08, 2016, 17:20
Ну вообще-то есть и др направления кроме ООП.

Не, я имел в виду не ООП, а проблемую ориентацию.
Ну т.е. существуют библиотеки алгоритмов (например, SimdLib), которые решают достаточно четкие задачи - как правило, подается вход и набор параметров, а на выходе - решение. API выглядит обычно приблизительно так:

Result& DoSomething(const Input& in, const Params& params);

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

А насчет общности - а всегда ли она нужна? Существуют же YAGNI и KISS для чего-то :)

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



Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 08, 2016, 18:34
Да, возвращаясь к теме. Есть метод
Цитировать
QString & QString::replace(const QRegExp & rx, const QString & after)
Наверное самым четким решением был бы еще метод
Цитировать
typedef QString (*ReplaceFunc)( const QRegExp & rх ); 
QString & QString::replace(const QRegExp & rx, ReplaceFunc rep);
Чтобы подставлять то что выдаст функтор, а не тупо константу.

Возвращаясь к "общему разговору" :)
где DoSomething однозначно описывает решаемую задачу, параметры тоже достаточно однозначны. Иначе разработчику приходится решать не проблему, а бороться с архитектурой,
Насколько я понял, буст (и др направления в программировании) наоборот, хотят от этой однозначности уйти. Все может быть "чем-то" (в плюсах это темплейт) которое можно интерпретировать всяко. Просто переменная - уже типа западло, нужно думать на уровне хотя бы ф-ций (я не умею). Что-то в этом может и есть, но думается все же это спорно/проблематично.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 08, 2016, 18:57
С темплейтами в C++ несколько больших проблем, главные из них:
- разные компиляторы их до сих пор "понимают" несколько по-разному (возьмем студию и gcc, например);
- не всегда однозначно можно понять, что подразумевал автор;
- в разы замедляется время компиляции;
- ухудшаются возможности по оптимизации кода.

Что, однако, не отменяет правильное использование темплейтов (то, для чего они изначально создавались - построение контейнеров, например). Все остальное, обычно, от лукавого :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 08, 2016, 23:32
Цитировать
Мои наблюдения за Вашим развитием (точнее регрессом) этих выводов о полезности не подтверждают  :)
Да ну.. на оценку Вашего мнения в отношении себя мне фиолетово  :) Так что, с позволения Вашего Величества, оставлю без комментариев подобные выпады)

Цитировать
Свежий пример
...
Что человек извлекает из этого? Ну надо запомнить "+_w" и "s1", и, конечно, как вызывать. Потом у себя в тексте повторить. УСЕ. Какие нафиг "концепты"? Тупенькая запоминаловка рулит  :)
Т.е. Вы признаёте, на сколько просто с помощью буста можно решать подобные задачи, даже человеку, не слишком посвященному в тонкости и всякие концепты?
А теперь посмотрим на следующий пример:
Код
C++ (Qt)
QString str = "text text <span></span> cd(ab) <a href="http://www.prog.org.ru/index.php?action=search;advanced"><img src="http://prog.org.ru/Themes/default/images/filter.gif" align="middle" style="margin: 0 1ex;" alt="" /></a>";
QString out = ReplaceBlanks(str);
 
Так что же простой пользователь извлекёт из этого? Что я, как конечный пользователь, должен подумать? Для меня этот Ваш ReplaceBlank ровно ни о чём не говорит.. И более того, он решает лишь одну очень частную задачу (в том случае, если пользователь всё же догодается для чего он нужен).. Достаточно слегка изменить условие и никто, кроме, возможно Вас, не станет разбираться, а тем более, переписывать это всё под новую задачу.

Цитировать
Вот сказу честно: как мне кажется, буст - это отличный пример оверинжиниринга и антипаттернов Gas factory и Soft code. Главная проблема буста - он не является проблемно-ориентированной библиотекой, а представляет из себя набор слабо связанных между собой модулей. То есть для того, чтобы РЕШИТЬ с его помощью определенную задачу, надо потратить битый час на то, чтобы разобраться с архитектурой и параметризацией. Действительно ли хочет этого заказчик? Или ему нужно решение проблемы наиболее эффективным способом?
Ну откуда такие комплексы и страх перед всем новым? Вы знаете, Racheengel, я честно скажу - я не програмист.. Программирование не является моей работой, а скорее побочным эффектом.. И к кодингу я всячески стараюсь пребегать только тогда, когда уже без этого ну никак нельзя.. Но.. Но я, тем не менее, не вижу никакой проблемы по части разобраться как и что устроено в бусте, если мне это интересно и действительно нужно.. Да, там на начальных порах нужно преодолеть некий барьер вхождения.. Но зато потом это окупиться) Вы с igors'ом же, похоже, не разобравшись, имея лишь поваерхностное представление (уверен Вы даже и не подозревали о категориях итераторов) вот так просто делаете достаточно категоричные суждения и выводы..
Я Вам привёл доводы в пользу буста, как инструмента, который можно адаптировать под разные нужды/типы/контейнеры и т.д.. Какие из лично Ваших решений обладают таким потенциалом? Ммм :)    
 
  
 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 09, 2016, 00:50
эээ... мне кажется, я понимаю, в чем дело :)
Мы с Вами, m_ax, смотрим на одну и ту же вещь с разных сторон зеркала)

Для Вас буст - это нечто, что можно изучать и пытаться использовать, и, возможно, не ошибусь - Вас интересует, наверное, больше процесс, чем результат (А как же оно устроено? Как фунциклирует весь этот мир? ага, вот так вот и так вот!) Это в любом случае позитивно характеризует Вас, как ученого-физика, да и для работы Вам же в любом случае приходится что-то программировать :)

Для меня же буст - это всего лишь один из инструментов, с помощью которого можно решать определенные задачи. Дело совсем не в "страхе перед новым" - особо нового я в бусте ничего не вижу, скорее наоборот - от некоторых решений прямо-таки веет перфокартами) Я знаю, например, что такое итераторы, и представляю, как они внутри устроены и во что их может "развернуть" компилятор. Хотя, тоже скажу честно  - я тоже не совсем C++ программист (и даже в универе мы его не учили :) ) - я в своё время программил разные контроллеры "на ассемблерах", и в мир ООП пришел (стыдно даже сказать) через "мерзкую Дельфи". Сейчас область, в которой я работаю, требует высокой производительности в реальном времени, и постоянного обмена данными с довольно специфичным железом. Там и параллельные вычисления (SSE и прочие AVX), и распознавание образов, и многопроцессорные системы, и 3д-графика... Объёмы кода проектов в этой отрасли - это сотни тысяч и миллионы строк, и само собой, дело не "одного ковбоя в поле", а постоянная командная работа.

Поэтому ввод новой технологии (типа буста) в обиход - это процесс не одного месяца. Для того, чтобы добавить в проект очередную зависимость, требуется чёткое представление о необходимости и оправданности такого решения (причём не только на уровне Software Development). Это значит, что надо переучивать команду, затрачивая на это время и деньги (довольно значительные). Естественно, это выльется в удорожание продуктов для конечных заказчиков, на что "верхний" менеджмент будет смотреть сами понимаете как :) И поди объясни заказчику, что "вы понимаете, теперь система стоит на 10000 евро дороже, так как мы решили перейти на другую технологию". Первым же его вопросом будет - "а система стала быстрее работать? мы можем с её помощью добиться больше, чем раньше?"

Далее, командная работа подразумевает текучесть кадров (какую-никакую, но она есть). А это значит, что вновь пришедшие сотрудники также должны затратить своё (и компании) время на изучение того, с чем им придется работать. Одно дело, если это штука типа Qt, где код практически самодокументирован. И совсем другое, если это либа, состоящая из шаблонно-итераторных решений. Сколько будет "втыкать в код" не-специалист в бусте? Или же нам придётся искать спецов, которые ко всему тому спектру требований, что выставляет отрасль (а это и так "полтора землекопа в год"), должны быть ещё и спецами в определённой библиотеке :(

И вот, задав себе все вышеописанные вопросы, я задаю один, обобщающий: "стоит ли оно того или нет?" Что будет для компании более оправданным - внедрение и поддержка универсального, но во всех отношениях "тяжёлого" решения на последующее время или мелкие и недорогие, но быстрые и эффективные "велики"? Ответ не так прост, как кажется...

PS. Лично моё мнение - всякие хорошие вещи рано или поздно скатываются в УГ. C был хорошим языком для своего времени, C++ также был неплох до недавнего времени, но теперешний вектор его развития больше напоминает возвращение в пещеры :( Не зря сейчас всякие Rustы с Nimами полезли, как мухоморы, из всех щелей...



Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 09, 2016, 12:51
Цитировать
И вот, задав себе все вышеописанные вопросы, я задаю один, обобщающий: "стоит ли оно того или нет?" Что будет для компании более оправданным - внедрение и поддержка универсального, но во всех отношениях "тяжёлого" решения на последующее время или мелкие и недорогие, но быстрые и эффективные "велики"? Ответ не так прост, как кажется...
Согласен, да, здесь сложно найти золотую середину)
Здесь ещё один момент - Ваша компания и разработчики буста приследуете несколько разные задачи. Вы пишите конкретно под себя, буст же вынужден быть таким, чтобы дать возможность использывать эту библиотеку в различных проектах. Он просто обязан быть гибким, цена за что - порог вхождения) Но это совершенно нормально.)   


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 09, 2016, 12:56
Так что же простой пользователь извлекёт из этого? Что я, как конечный пользователь, должен подумать? Для меня этот Ваш ReplaceBlank ровно ни о чём не говорит.. И более того, он решает лишь одну очень частную задачу (в том случае, если пользователь всё же догодается для чего он нужен).. Достаточно слегка изменить условие и никто, кроме, возможно Вас, не станет разбираться, а тем более, переписывать это всё под новую задачу.
Хорошо, допустим в проект пришел новый человек, у него пока опыта с гулькин нос, но вот надо что-то изменить. Найти место где заменяются пробелы - да, в тонне кода это может потребовать времени, но это неизбежно, с этой точки зрения все предложенные варианты одинаковы. А вот разобраться .. в моем коде нормальный студент (второго курса) разберется без проблем. А вот в Вашем - не уверен. Необходимо знание регулярок. Ну это еще полбеды - но вот сколько он будет париться пока догонит как юзать темплейт - хз. Учтите что под рукой у него не будет примерчика с main как здесь. При этом число строк в Вашей и моей реализации практически одинаковы.

Тут обычно начинают фыркать, типа "это не для кухарок писалось!", "грош ему цена если не знает регулярок!", "кто ж виноват что он не разобрался?", а то и совсем нехорошо/некорректно, типа "это не для средних программистов!". Причина хорошо понятна: голубая мечта любой зубрилки - чтобы ей платили за "багаж знаний" :) В действительности виноват тот кто "накрутил" код без всякой необходимости. Простой код - огромное преимущество, может компенсировать многое.

Ладно, пресловутая "общность". Да, мой код не обладает никакой общностью, да, с ним можно расстаться в любой момент, заменив на что-то другое. И это не плохо, а хорошо :) Во-первых мне, т.к. я потратил 5-10 минут и забыл. Продумать действительно общее решение заняло бы у меня куда больше времени, но зачем если это всего лишь одноразовый эпизод? Во-вторых работающему с моим кодом - зачесалось обобщать - на здоровье, а нет - так copy/paste и пару строк подправил. И не надо носик воротить, это нормально. А вот попытки использовать Вашу "обобщенную" вероятно кончатся плачевно. Напр выяснится что менять надо совсем не cap(1), а что-то другое - вот и приплыли. Заметим что др предложенные решения также не стремились ни к какой общности - для нее может и не быть оснований.

Перейдем к бусту. То что там немало идей - никто не спорит. Но вот как-то уж совсем "неласково". Заботы о пользователе буста ноль, упор на концепции. "Умный и так разберется, а дураку и не надо". Жизнь этого тезиса не подтверждает. Время на "разберется" стоит денег. Да, Вы привели нормальный пример xpressive, но почему с гуглы, а не "тыц в доку" (как у нормальных людей). Прочтешь концепты - ну вроде понятно. Но описания методов (по сути хедеры) - так ну его нафиг. Куда там керосин заливать - хз. И очень быстро думается "та ладно, я и так это сделаю за 5 минут". И не надо думать что это "жалкий велик" взамен "действительно глубокого" решения :) Это мудрый выбор профессионала (да-да)  :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 09, 2016, 14:54
Согласен, да, здесь сложно найти золотую середину)
Здесь ещё один момент - Ваша компания и разработчики буста приследуете несколько разные задачи. Вы пишите конкретно под себя, буст же вынужден быть таким, чтобы дать возможность использывать эту библиотеку в различных проектах. Он просто обязан быть гибким, цена за что - порог вхождения) Но это совершенно нормально.)   

Я понимаю, что Вы хотите сказать. Конечно, решения, прибитые гвоздями, не всегда являются подходящими для всех. Но по поводу гибкости - она не должна находиться "над" здравым смыслом. Вот, допустим, пример из буст-регекста:

template<typename OutIter, typename BidiIter, typename Formatter>
  OutIter regex_replace(OutIter out, BidiIter begin, BidiIter end,
                        basic_regex< BidiIter > const & re,
                        Formatter const & format,
                        regex_constants::match_flag_type flags = regex_constants::match_default,
                        unspecified = 0);

Вам этот API кажется логичным и гибким? А мне нет. И вот почему:

Проблема 1. Как у нас задается "входной" контейнер? Видно, что двумя итераторами - BidiIter begin, BidiIter end. Первый же вопрос: ЗАЧЕМ? Два различных итератора подразумевают, что человек может взять begin от одного контейнера, а end от другого. Ведь с точки зрения параметров это абсолютно легитимно.

На самом же деле все, что здесь нужно - возможность задать контейнер, как единую сущность (в самом деле, 99% пользователей будут тут писать v.begin(), v.end()). Таким образом мы уменьшаем количество параметров - раз, убираем вероятность передачи неверного параметра - два.

Проблема 2. "Выходные" параметры. Есть OutIter out. И есть OutIter, возвращаемый как результат. Что здесь ожидать программисту? Должен он в качестве параметра передавать out как начало контейнера результата? Наверное, да. Но что тогда он получит как результат функции regex_replace? Конец этого контейнера? ЗАЧЕМ?

Достаточно будет опять же одного параметра в виде контейнера.

Проблема 3. Задать регулярное выражение. basic_regex< BidiIter > const & re. Опять итераторы... ЗАЧЕМ? Для чего регулярку задавать итератором, когда это ничто иное, как строковая константа? Ну ок, должна быть прекомпилирована. Но тогда для этого хватит одного лишь класса, вроде RegExp(const std::string& re);

Проблема 4. Форматтер. Какой у него интерфейс? Из API видно только, что передается некое typename Formatter. Оказывается, что это функтор, а не класс. Получает smatch на вход и возвращает std::string на выход. В примере из гугла внутри функтора создается временная строка, которая преобразуетя и возвращается как КОПИЯ, где, скорей всего, будет еще раз скопирована. Т.е. 3 вызова конструктора строки обеспечены. Производительность, зачем?

А вот как это должно выглядеть по человечески:

void regex_replace(const Container& in, Container& out, const ReClass& re, const Formatter& format, int flags...);

class ReClass
{...
ReClass(const std::string& re)
{
 // here re will be precompiled etc.
}
};

class Formatter
{...
virtual bool DoFormat(Container::const_iterator& from, Container::const_iterator& to, Container::iterator& out)
{
 // нашли текст от from до то в Container in,
 // изменили,
 // положили его в out,
 // вернули true.
 // Если ничего с ним не делали и не меняли - вернули false.
}
};



Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 09, 2016, 22:27
Цитировать
Хорошо, допустим в проект пришел новый человек, у него пока опыта с гулькин нос, но вот надо что-то изменить.
и далее по списку.. Да, я внимательно прочёл всё нижеследующее, и отчасти понимаю Ваши аргументы.. Но..
Вы действительно полагаете, что затевая какой-либо более-менее крупный проект, который в последующем потребует быстрого расширения и гибкости, нанимая на работу "студентов за еду", которые даже и регулярок толком не знают, Вы ожидаете в недалёком будущем выйграть в себестоимости Вашего поприща? Серьёзно? Этот тезиз реально основан на Вашем личном опыте? Нет, я не заю как на сегоднешней день обстоят дела в действительности, но сейчас для меня это утверждение находится под большим сомнением..   Могу ошибаться, но я пока не увидел реально сильных аргументов в пользу Вашей позиции..

Цитировать
Вам этот API кажется логичным и гибким? А мне нет. И вот почему:

Проблема 1. Как у нас задается "входной" контейнер? Видно, что двумя итераторами - BidiIter begin, BidiIter end. Первый же вопрос: ЗАЧЕМ?
Зачем?! А Вы попробуйте написать такую функцию, чтоб туда можно было впихнуть и C массив и какой-либо контейнер и реализацию от Васи Пупкина..
А Вас не смущает стандартная библиотека алгоритмов?

Цитировать
Проблема 2. "Выходные" параметры. Есть OutIter out. И есть OutIter, возвращаемый как результат. Что здесь ожидать программисту? Должен он в качестве параметра передавать out как начало контейнера результата? Наверное, да. Но что тогда он получит как результат функции regex_replace? Конец этого контейнера? ЗАЧЕМ?
Затем чтоб иметь информацию, где завершился этот алгоритм..  И использовать это условие в более сложных конструкциях..

Цитировать
Проблема 3. Задать регулярное выражение. basic_regex< BidiIter > const & re. Опять итераторы... ЗАЧЕМ?
Я уже отвечал на этот вопрос.. Как Вы себе представляете реализацию регулярки, которая может работать с совершенно разношёрстными последовательностями (QString, std::string и т.д.)?

Цитировать
Проблема 4. Форматтер. Какой у него интерфейс? Из API видно только, что передается некое typename Formatter. Оказывается, что это функтор, а не класс. Получает smatch на вход и возвращает std::string на выход. В примере из гугла внутри функтора создается временная
строка, которая преобразуетя и возвращается как КОПИЯ, где, скорей всего, будет еще раз скопирована. Т.е. 3 вызова конструктора строки обеспечены. Производительность, зачем?
Опять же, сигнатура форматера напрямую зависит от типов данных с которыми Вы работаете. Это может быть QString, std::string  и т.д.. Соответственно и регулярка тоже будет иметь соответствующий тип.. Более того, в качестве форматера может быть передан и класс (все иы знаем про bind). 
Цитировать
где, скорей всего, будет еще раз скопирована. Т.е. 3 вызова конструктора строки обеспечены. Производительность, зачем?
Нет, на самом деле производительность от этого не постродает (если только на самых древних компиляторах).. Сейчас это стандарт де-факто.
 
Цитировать
А вот как это должно выглядеть по человечески:
А как быть тем, кто работает не с std::string? Вы сейчас их права ущемляете :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 10, 2016, 00:55
Зачем?! А Вы попробуйте написать такую функцию, чтоб туда можно было впихнуть и C массив и какой-либо контейнер и реализацию от Васи Пупкина..

Зачем заниматься ерундой и скрещивать ежа с носорогом?! :)
Функция должна принимать на вход параметры определенного типа, под которые она наиболее оптимально имплементирована.
Конвертирование входных и выходных данных - дело исключительно вызывающей стороны.
Возьмите любую профессиональную библиотеку для, например, обработки изображений.
Там Вы не увидите ни одной функции, принимающей на вход bmp, jpg, png, gif и прочие популярные форматы (не говоря уже про пупкинские).
Вместо этого там будет что-то типа DoFilter(const unsigned char* in, unsigned char* out, int stride,...) и т.д.
Функция просто выполнит свою работу, используя тот тип данных, который для неё является наиболее оптимальным.
КАК Вы передатите ей данные - это Ваша задача. Хочет Пупкин передать MyPupkinContainer? Пусть пишет конвертор. Почему это должно быть проблемой разработчиков библиотеки?

А Вас не смущает стандартная библиотека алгоритмов?

Смущает, очень. И не только меня. Линуса (который Торвальдс), например, тоже смущает.
Процитирую: "You invariably start using the "nice" library features of the language like STL and Boost and other total and utter crap..."

И да, Вы не передадите в STL-функции QString в качестве параметра :)

Цитировать
Проблема 3. Задать регулярное выражение. basic_regex< BidiIter > const & re. Опять итераторы... ЗАЧЕМ?
Я уже отвечал на этот вопрос.. Как Вы себе представляете реализацию регулярки, которая может работать с совершенно разношёрстными последовательностями (QString, std::string и т.д.)?

А никак. Она и не обязана. Внутри "себя" движок регулярок использует один-единственный формат - юникод. И приведенные функции тупо конвертируют входные данные, полученные через итераторы, во "внутреннее представление" (то есть аллоцируют память и пробегаются от begin() до end(), переводя каждый символ в то, что "ест" движок). Можете ли Вы быть уверены в эффективности этого действия для любых входных данных? я - нет :)

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

Цитировать
где, скорей всего, будет еще раз скопирована. Т.е. 3 вызова конструктора строки обеспечены. Производительность, зачем?
Нет, на самом деле производительность от этого не постродает (если только на самых древних компиляторах).. Сейчас это стандарт де-факто.

Ага, именно поэтому в C++11 добавили Rvalue References :)
 
А как быть тем, кто работает не с std::string? Вы сейчас их права ущемляете :)

Qt почему-то тоже "не умеет" отображать виджеты GTK :) Права гнумовцев ущемлены, Qt sucks? :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 10, 2016, 06:00
Проблема 1. Как у нас задается "входной" контейнер? Видно, что двумя итераторами - BidiIter begin, BidiIter end. Первый же вопрос: ЗАЧЕМ? Два различных итератора подразумевают, что человек может взять begin от одного контейнера, а end от другого. Ведь с точки зрения параметров это абсолютно легитимно.

На самом же деле все, что здесь нужно - возможность задать контейнер, как единую сущность (в самом деле, 99% пользователей будут тут писать v.begin(), v.end()). Таким образом мы уменьшаем количество параметров - раз, убираем вероятность передачи неверного параметра - два.
Даже если мы хотим произвести действия над частью контейнера (пусть в году раз) - это легко сделать без итераторов (см здесь (http://www.prog.org.ru/index.php?topic=29506.msg216838#msg216838)). То что эти объявления итераторов громоздки и налипают бесполезным хламом - по-моему более чем очевидно. Но увы, так делают и std и boost - и поэтому "так правильно", остальное "неграмотно"  :'(

Но.. Вы действительно полагаете, что затевая какой-либо более-менее крупный проект, который в последующем потребует быстрого расширения и гибкости, нанимая на работу "студентов за еду", которые даже и регулярок толком не знают, Вы ожидаете в недалёком будущем выйграть в себестоимости Вашего поприща? Серьёзно? Этот тезиз реально основан на Вашем личном опыте?
Не скрою, нанимать "студентов за еду" хотелось бы, но ничего не выходит - они не тянут наши задачи. Однако владение бустом и/или std - отнюдь не "залог успеха", эти знания оказываются, ну, скажем, "малополезными". Для нас важнее другие вещи, в первую очередь понимание основ 3D (которые на первый взгляд кажутся очень простыми), да и геометрии вообще, часто нужны математика и физика. Конечно есть и др работа - и с UI (куда ж без него) и с OpenGL (ненавижу эту заразу) и др, но это "решаемо". Поэтому если человек не знает регулярок или "bidirectional iterators" - для нас это не имеет никакого значения  :)

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


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 10, 2016, 15:43
Цитировать
Зачем заниматься ерундой и скрещивать ежа с носорогом?!  :)
Функция должна принимать на вход параметры определенного типа, под которые она наиболее оптимально имплементирована.
Ok, покажите, например, какой дожна быть сигнатура алгоритма std::copy? Какие конкретные типы контейнеров она должна принимать?
Думаю после этого примера всё станет на свои места)

Цитировать
А никак. Она и не обязана. Внутри "себя" движок регулярок использует один-единственный формат - юникод.
O____o Т.е. только QString? А если я не хочу прикручивать к моей маленькой консольной програмке Qt? Я работаю с string и wstring. Что мне делать?

Цитировать
Даже если мы хотим произвести действия над частью контейнера (пусть в году раз) - это легко сделать без итераторов (см здесь).
Так в той теме (по ссылке) как раз-таки и было показано ровно противоположное, а имено костыльность и неуниверсальнось реализации того класса "для ДЕЛА " :)

Цитировать
Как-то здесь мелькнула удачная фраза типа "если и без какой-то технологии цель легко достигается - то такая технология не очень нужна".
Ну если написание 100500 велосипедов дя разбора 100500 вариантов задач - это легко, то настаивать не вижу смысла) К чёрту регулярки) Хардкор, только хардкор)
   


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 10, 2016, 16:31
Ну если написание 100500 велосипедов дя разбора 100500 вариантов задач - это легко, то настаивать не вижу смысла) К чёрту регулярки) Хардкор, только хардкор)
m_ax, вы предложите задачу посложней, например разбирать и валидировать номера телефонов, набранных как угодно, а лучше паспортные данные с домашним адресом.
И сразу в теме возникнет тишина. :)
А если и QString у ребят "заберете", то будет как на картинке. :)

/* Цифры из строки доставать или простые теги, оно легко велосипедиться, а как что посложней сразу регулярки становятся нужными, а лучше boost.spirit. :) */


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 10, 2016, 17:26
Цитировать
А никак. Она и не обязана. Внутри "себя" движок регулярок использует один-единственный формат - юникод.
O____o Т.е. только QString? А если я не хочу прикручивать к моей маленькой консольной програмке Qt? Я работаю с string и wstring. Что мне делать?

Почему "только QString" то??? Разве юникод только QStringом ограничивается? :)

Я имел в виду другое - Вы же не думаете, что движок регулярок имеет отдельные имплементации для string и отдельно для wstring :) (хотя, конечно, можно собрать несколько версий одного и того же с разными типами данных, но я правда так не думаю - это был бы ад для тех, кто его разрабатывает). "Внутри" этот движок, скорее всего, юзает 2-байтовое (например) представление всех символов и жёстко оптимизирован на это. А то, что подаётся на вход boost-функции, в первую очередь "переводится" в это 2-байтовое представление, и уже эти данные подаются в движок.

Я к тому - зачем нам иметь лишний слой итераторов, когда можно просто подать, скажем, std::wstring на вход (стандартная же библиотека, все таки). А пользователь, если работает с QString или чем подобным, пусть сам позаботится о конвертации в wstring. В конце концов, регулярки придуманы для работы с текстовыми строками, а не с абстракными контейнерами :)

Ok, покажите, например, какой дожна быть сигнатура алгоритма std::copy? Какие конкретные типы контейнеров она должна принимать?

У алгоритма std::copy абсолютно иной use case. В отличие от регулярок, он оперирует тупо с последовательностью байт, без разницы, в каком формате входные данные. И копирование не всего контейнера, а только его подмножества - довольно часто встречающаяся задача. Хотя его сигнатура тоже не небезопасна - так, вместо end-итератора, как по мне, было бы более правильно указывать длину последовательности. А выходным параметром, соответственно, кол-во скопированных символов. Как то так, наверное.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 10, 2016, 21:20
/* Цифры из строки доставать или простые теги, оно легко велосипедиться, а как что посложней сразу регулярки становятся нужными, а лучше boost.spirit. :) */

А чем плох кутишный движок регулярок? (все-таки в исходном топике вопрос был про QRegExp)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 10, 2016, 21:24
А чем плох кутишный движок регулярок? (все-таки в исходном топике вопрос был про QRegExp)
Ничем. Ну может только не так быстр, как бустовский.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 10, 2016, 23:19
Цитировать
m_ax, вы предложите задачу посложней, например разбирать и валидировать номера телефонов, набранных как угодно, а лучше паспортные данные с домашним адресом.
И сразу в теме возникнет тишина  :)
Да не.. Вы что из лесу вышли что-ли? "Букварь" - это пойло для лохов) А  как же творческий подход?)Да и потом собственный велосипед и ближе и дешевле в конечном итоге)

Цитировать
Я имел в виду другое - Вы же не думаете, что движок регулярок имеет отдельные имплементации для string и отдельно для wstring  :)
   
Нет конечно, в бусте имплементация одна, но её фишка в том, что она может работать и с QChar и с char и с short и т.д..

Цитировать
"Внутри" этот движок, скорее всего, юзает 2-байтовое (например) представление всех символов и жёстко оптимизирован на это.
 
Ммм, нет.. Движок вытаскивает информацию о символах из специализации char_traits.. И Вы можете написать лично свою специализацию этого класса харрактеристик под свой собственный тип данных, что позволит Вам его (буст) использовать/адаптировать.

Цитировать
Я к тому - зачем нам иметь лишний слой итераторов, когда можно просто подать, скажем, std::wstring на вход (стандартная же библиотека, все таки).
 
Так пожалуйста, подавайте) Вас же никто не заставляет подавать на вход итераторы) Я вот недавно приводил пример, без всяких итераторов) И не зря там несколько перегрузок функций существует)

Цитировать
У алгоритма std::copy абсолютно иной use case.
Так значит у copy он иной) Хорошо, а в какой, например, алгоритм из stl Вы бы рекомендовали передавать конкретные типы контейнеров/данных?

Цитировать
Хотя его сигнатура тоже не небезопасна - так, вместо end-итератора, как по мне, было бы более правильно указывать длину последовательности.
Т.е. Вы гарантируете, что с длиной последовательности мы скорее всего не ошибёмся (а если мы её заранее не знаем?), или это будет реже, чем, например, если в качестве второго аргумента мы невзначай укажем end от другого контейнера? Это Ваш аргумент?  :)







Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 11, 2016, 01:33
Так значит у copy он иной) Хорошо, а в какой, например, алгоритм из stl Вы бы рекомендовали передавать конкретные типы контейнеров/данных?

Я больше скажу - copy среди всех остальных алгоритмов - единственное исключение, где использование итераторов оправдано тем, что задача скопировать часть последовательности возникает гораздо чаще, чем задача поиска, скажем, минимума только в части контейнера (иначе copy(a.begin(), a.end(), b.begin()) вырождается в b = a).

Насколько часто Вам лично приходилось передавать в алгоритмы итераторы, отличные от begin() и end()? Только честно :)
Я полагаю, что это что-то между 99% и 99.9%. То есть мы пишем do_stuff(a.begin(), a.end(), b.begin()) в подавляющем большинстве случаев.
Почему бы не расширить API всех алгоритмов на использование полных контейнеров? Например, до do_stuff(a, b) вместо вышенаписанного.

Кстати, именно по этой причине в c++ появился foreach :)
В реальности, 90% записей оператора for выглядело как for (i = 0; i < v.size(); ++i)...

Т.е. Вы гарантируете, что с длиной последовательности мы скорее всего не ошибёмся (а если мы её заранее не знаем?), или это будет реже, чем, например, если в качестве второго аргумента мы невзначай укажем end от другого контейнера? Это Ваш аргумент?  :)

Да. Гарантирую. Тем, что переданная длина, если она превышает реальную, может легко быть ограничена реальной длиной контейнера (length = min(realLength, inputLength), чего не добиться в случае "неправильных" итераторов.

Более того - параметр длины можно сделать значением по умолчанию равным, скажем, 0, что будет указывать на "конец контейнера".


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 11, 2016, 08:12
Ну если написание 100500 велосипедов дя разбора 100500 вариантов задач - это легко, то настаивать не вижу смысла) К чёрту регулярки) Хардкор, только хардкор)
Ну чего Вы заливаете? :) Какие 100500? Я лично не могу вспомнить когда последний раз что-то заменял. Судя по тому что Ваша реализация написана прямо сейчас - у Вас то же самое. Не надо суетиться с немедленным обобщением - дождитесь когда пойдет "струя" таких задач, к этому времени уже накопится опыт 2-3 решенных, т.е. Ваше обобщение будет зрелым.

Нет конечно, в бусте имплементация одна, но её фишка в том, что она может работать и с QChar и с char и с short и т.д..
Боже мой, сколько сил, в конце-концов интеллекта бездарно разбазарено на эту "манечку общности" :'( Загадить текст итераторами по самые помидоры, заставить всех изучать эту хренотень, и потом еще ходить с гордым видом "Во, общий!! И с этим работает и с тем, и ВООБЩЕ С ЧЕМ УГОДНО!". Браво!

Только вот почему Qt так не делает? Почему ф-ционал QString никак не распространяется на что-то еще? Хорошо, пусть исключение. Др фреймворк, напр wxWidgets - почему и там то же самое с wxString? Не знаете? Так я Вам скажу почему: потому что умные люди. Потому что понимают что выгодная запись ежедневных операций для программиста куда важнее "улетов в концептуальность".

Ok, покажите, например, какой дожна быть сигнатура алгоритма std::copy?
Да никакой это не "алгоритм", а бессовестная эксплуатация той же "общности". Смотрите - и так можно, и эдак, сработал бы оператор =. Да, мило, забавно, но это экономия 2 строк (чаще одной). А Вы воспринимаете это серьезно.

А для алгоритмов есть раздел на этом форуме. И там очень быстро "наступает тишина" (даже отнимать ничего не надо  :)). И куда только деваются обширные познания std и.т.п?  И нужны ли они если никак в работе не помогают?  :) 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 08:37
Загадить текст итераторами по самые помидоры, заставить всех изучать эту хренотень
Итераторы настолько примитивная вещь, что изучать их не требуется.

Только вот почему Qt так не делает? Почему ф-ционал QString никак не распространяется на что-то еще? Хорошо, пусть исключение. Др фреймворк, напр wxWidgets - почему и там то же самое с wxString? Не знаете?
Знаем. Потому что это GUI-библиотеки и задачи перед ними стоят другие - создавать GUI.
А вот стандартная библиотека и boost, как раз должны уметь работать как с QString, так и с wxString, или MySuperString. Что бы разработчик независимо от используемых фрейворков мог использовать заложенный в них (в stl и boost) функционал.

А для алгоритмов есть раздел на этом форуме. И там очень быстро "наступает тишина" (даже отнимать ничего не надо  :)). И куда только деваются обширные познания std и.т.п?  И нужны ли они если никак в работе не помогают?  :) 
Там наступает тишина совсем по другой причине и она никак не связана с программированием. ;)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 11, 2016, 09:12
Знаем. Потому что это GUI-библиотеки и задачи перед ними стоят другие - создавать GUI.
Логика людей с хорошей памятью всегда была недоступной для меня :) Ну UI-то здесь причем ??? Почему не сказать то что очевидно для всех, напр так

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

А вот стандартная библиотека и boost, как раз должны уметь работать как с QString, так и с wxString, или MySuperString. Что бы разработчик независимо от используемых фрейворков мог использовать заложенный в них (в stl и boost) функционал.
Вот и хорошо, и пусть Андрюша Александреску этим занимается. А нормальному человеку лезть в этот дурдом совершенно незачем. 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 09:27
Ну UI-то здесь причем ???
Притом, что задачи у них разные. Стандартная библиотека должна уметь работать с разными последовательностями символов (QString/wxString/MySting/string/char*/...), на то она и стандартная. Для Qt и wxWidgets таких задач не стоит, поэтому они пошли простым для себя путем.

- общие решения не всегда так уж хороши именно вследствие своей общности, что создает некоторую громоздкость. Это нормально, всякая палка о двух концах.
По разному бывает. Бывает общее решение намного короче и эффективней некоторых частных. :)

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



Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 11, 2016, 10:04
Цитировать
Я больше скажу - copy среди всех остальных алгоритмов - единственное исключение, где использование итераторов оправдано тем, что задача скопировать часть последовательности возникает гораздо чаще, чем задача поиска, скажем, минимума только в части контейнера (иначе copy(a.begin(), a.end(), b.begin()) вырождается в b = a).

Насколько часто Вам лично приходилось передавать в алгоритмы итераторы, отличные от begin() и end()? Только честно  :)
Я полагаю, что это что-то между 99% и 99.9%. То есть мы пишем do_stuff(a.begin(), a.end(), b.begin()) в подавляющем большинстве случаев.
Почему бы не расширить API всех алгоритмов на использование полных контейнеров? Например, до do_stuff(a, b) вместо вышенаписанного.
Ну так расширте, если Вам так удобнее, кто мешает?
Код
C++ (Qt)
template <class Container>
void some_algorithm(const Container & c)
{
   std::some_algorithm(c.begin(), c.end());
}
 
STL даёт Вам такую возможность, легко..
Но только если Вы  лично в 99.9% случаях передаёте начало и конец последовательности, это вовсе не означает, что всех остальных можно лишить возможности передавать произвольный range.  
Не ну, правда, какие то у Вас смешные претензии к stl..

Цитировать
Кстати, именно по этой причине в c++ появился foreach  :)
foreach это хорошо.. А знаете что он требует от контейнера, чтоб он с ним мог работать? :)

Цитировать
В реальности, 90% записей оператора for выглядело как for (i = 0; i < v.size(); ++i)...

То что Вы в 90% случаев используете контейнеры с доступом по индексу, совсем не означает что все так пишут) Попробуйте таким for'ом по списку пройтись)

Цитировать
Более того - параметр длины можно сделать значением по умолчанию равным, скажем, 0, что будет указывать на "конец контейнера".
Хорошо, пожалуйста, stl даёт Вам возможность:
Код
C++ (Qt)
template <class Container>
void some_algorithm(const Container & c, size_t n = 0)
{
   std::some_algorithm(c.begin(), std::advance(c.begin(), n));
}
 
Только чем это лучше? Только тем, что лично Вам так больше нравится? Но это опять же не аргумент.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 11, 2016, 11:42
Цитировать
и пусть Андрюша Александреску этим занимается. А нормальному человеку лезть в этот дурдом совершенно незачем.

Александреску - вообще жирный румынский тролль :) Написал библотеку с названием Loki (посмотрите, кто это в скандинавской мифологии), а опосля срулил с C++ на D и теперь усиленно троллит в этом направлении :)

Цитировать
Попробуйте таким for'ом по списку пройтись)

То Вы, наверное, промышленного кода больших контор не видели :) Такие форы там на каждом шагу - часто потому, что люди, которые заняты в отрасли, так привыкли (многие перешли в C++ с программирования железа, где фор - до сих пор один из самых продвинутых концептов).

Цитировать
foreach это хорошо.. А знаете что он требует от контейнера, чтоб он с ним мог работать?

Сама по себе идея foreach прекрасна и должна была появиться вместе с классическим for. То, что каждый реализует его через свою Ж. - это проблема не foreach, а языка, в котором такая конструкция должна быть частью синтаксиса, а не сторонним расширением.

Цитировать
Только чем это лучше?

1. Меньше кода.
2. (следствие 1) Меньше потенциальных ошибок.
3. Лучше понимание и читаемость.
4. Компилятору будет проще оптимизировать доступ к элементам контейнера.

Цитировать
А вот стандартная библиотека и boost, как раз должны уметь работать как с QString, так и с wxString, или MySuperString.

Совсем не должны. Более того - это противоречит самой идее "стандартности".

Разработчики Qt поступили мудро. QString обеспечивает полноценную конверсию в std::string-и и назад. Тем самым stl освобождается от умения работы со всеми остальными типами строк :) И так должны поступать все производители сторонних либ, если они хотят иметь совместимость с stl, но не наоборот.


А вообще, принципы KISS и Less is more рулят :)
Как сказал Richard P. Gabriel, "Полнотой можно жертвовать в пользу остальных качеств и обязательно нужно жертвовать, если она мешает простоте."


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 11, 2016, 12:04
Ну так расширте, если Вам так удобнее, кто мешает?
Код
C++ (Qt)
template <class Container>
void some_algorithm(const Container & c)
{
   std::some_algorithm(c.begin(), c.end());
}
 
STL даёт Вам такую возможность, легко..
Так это придется писать для каждого some_algorithm. А если еще лямбда или хвунктор, то и его надо тащить. Поэтому обычно это делают макрухой. Помню варианты в тех или иных исходниках, но ни разу не возникло желания так делать.

Хорошо, пожалуйста, stl даёт Вам возможность:
Код
C++ (Qt)
template <class Container>
void some_algorithm(const Container & c, size_t n = 0)
{
   std::some_algorithm(c.begin(), std::advance(c.begin(), n));
}
 
А здесь еще size_t не годится, "все" должно быть отрицательное, поэтому напр ptrdiff_t. И std::advance может оказаться совсем не безобидным (для того же списка). И уважающий себя программист не лепит вызов одной ф-ции дважды.

Что std сделан "не по руке" - это точно. Захочешь воспользоваться хоть тем же сопливым std::find, но как вспомнишь что надо сравниваться с end() (а имя контейнера нормальное) - так ну его нафиг. Или тот же remove_if - извольте помнить что он ведь "только переставляет" и не забыть еще надеть erase, пока такое уродство распишешь...

Qt это тонко прочувствовали и подстелили соломки где надо, приятные мелочи типа QMap::value и др. А ведь чистой воды "велосипед" - но критиков почему-то не слышно  :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 11, 2016, 12:39
Цитировать
То Вы, наверное, промышленного кода больших контор не видели  :) Такие форы там на каждом шагу - часто потому, что люди, которые заняты в отрасли, так привыкли (многие перешли в C++ с программирования железа, где фор - до сих пор один из самых продвинутых концептов).
Т.е. Вы сейчас располагаете статистикой по всем большим конторам? :)

Цитировать
Сама по себе идея foreach прекрасна и должна была появиться вместе с классическим for. То, что каждый реализует его через свою Ж. - это проблема не foreach, а языка, в котором такая конструкция должна быть частью синтаксиса, а не сторонним расширением.
У нас сейчас есть foreach и сейчас это часть языка, в чём проблема? Более того, он может работать с любыми типами контейнеров и с со списком и с вектором и с C массивами и даже с доморощенной реализацией от бабы Вали)   Знаете чем это достигается? Итераторами. Он требует наличия у контейнера методов begin() и end().

Цитировать
1. Меньше кода.
Серьёзно? А если мне вдруг будет необходимо передать определённый range?
Цитировать
2. (следствие 1) Меньше потенциальных ошибок.
3. Лучше понимание и читаемость.
Высосана из пальца)
Цитировать
4. Компилятору будет проще оптимизировать доступ к элементам контейнера.
 
А вот здесь можно по-подробнее? Каким образом компилятору будет проще?)


Цитировать
Так это придется писать для каждого some_algorithm. А если еще лямбда или хвунктор, то и его надо тащить.
Да ладно, это Вы то мне такое говорите? Вы ж с товарищем Racheengel суровые мужики, что для Вас написать свою небольшую утилити? :)

Цитировать
А здесь еще size_t не годится, "все" должно быть отрицательное, поэтому напр ptrdiff_t.
Это с чего это всё должно быть отрицательно? O__o
Цитировать
И std::advance может оказаться совсем не безобидным (для того же списка).
Конечно может, но как говорил Richard P. Gabriel, "Полнотой можно жертвовать в пользу остальных качеств и обязательно нужно жертвовать, если она мешает простоте."

Цитировать
И уважающий себя программист не лепит вызов одной ф-ции дважды.
А где Вы там увидели вызов одной функции дважды?


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 12:42
Сама по себе идея foreach прекрасна и должна была появиться вместе с классическим for. То, что каждый реализует его через свою Ж. - это проблема не foreach, а языка, в котором такая конструкция должна быть частью синтаксиса, а не сторонним расширением.
m_ax говорил о том, что такая конструкция стала частью языка, и она как раз требует от контейнеров наличие итераторов для своей работы.

Совсем не должны. Более того - это противоречит самой идее "стандартности".
А в чем вы видите противоречие? Есть алгоритм, который одинаково работает с любыми коллекциями - это стандартность.

А вообще, принципы KISS и Less is more рулят :)
Как сказал Richard P. Gabriel, "Полнотой можно жертвовать в пользу остальных качеств и обязательно нужно жертвовать, если она мешает простоте."
А никто не против простоты. Для вас это сложно, потому что вы никогда этим не пользовались. Для другого будет сложным QString, для третьего iostream, по этой же причине.
Вот есть задача, разобрать правила cron, с помощью которых удобно задавать моменты времени. За сколько вы сможете реализовать их разбор с контролем правильности? Сколько это будет занимать строк кода? Как сложно это будет в дальнейшем сопровождать?
Я эту задачу решил за пару часов с помощью boost.spirit (и то столько времени потратил, потому что последний раз я пользовался им несколько лет назад). Решение занимает несколько строк кода, структуры для хранения разобранных данных занимают значительно больше.
Несколько строк с правилами разбора - вот это простота.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 12:48
Так это придется писать для каждого some_algorithm.
Ну если вам необходимо такое "упрощение", то конечно придется.

Поэтому обычно это делают макрухой. Помню варианты в тех или иных исходниках, но ни разу не возникло желания так делать.
Это же хорошо.

Что std сделан "не по руке" - это точно.
Да, не по вашей руке. Но это никак не беспокоит оставшейся мир. ;)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 11, 2016, 13:56
А в чем вы видите противоречие? Есть алгоритм, который одинаково работает с любыми коллекциями - это стандартность.

А должен работать исключительно с коллекциями, предоставляемыми стандартной библитекой и самим языком.
Не обязана библиотека, работающая с байтами и стандарными строками, поддерживать все виды QString, AtlString, CPupkinString и прочее.
Пусть это будет заботой пупкиных.

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

Пользовался, представьте себе, и не раз. И именно поэтому пишу здесь про недостатки, которые сам заметил.
А если для человека даже QString сложен - то ему уже ничто не поможет, тем более STL.

Вот есть задача, разобрать правила cron, с помощью которых удобно задавать моменты времени. За сколько вы сможете реализовать их разбор с контролем правильности?

Понятия не имею, что такое "правила cron" :) Поэтому, не зная контекста, судить не могу.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 11, 2016, 14:05
Да ладно, это Вы то мне такое говорите? Вы ж с товарищем Racheengel суровые мужики, что для Вас написать свою небольшую утилити? :)
Да за этим бы дело не стало, но Вы же сами видите что хороший код здесь не получить, по той простой причине что std на это не рассчитан. А с др стороны ф-ционал не так уж полезен/необходим чтобы "идти на жертвы",

Подавать контейнеры по ссылке (вместо итераторов) хотят многие, и давно. Некоторые из тех макросов (что я упомянул) писаны еще в 90-х. Контейнер - устойчивая сущность/образ, я всегда хорошо знаю что это. Итераторы - мелкие и гнусные клопы, за которыми надо все время присматривать, по меньшей мере помнить какому контейнеру они принадлежат. Вызывающему с ними тоже несладко. Вот простенький метод
Цитировать
QString & QString::replace(const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
Покажите пожалуйста как это выглядело бы в "общем виде" и как этим "полным решением" пришлось бы пользоваться. Спасибо


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 14:12
А должен работать исключительно с коллекциями, предоставляемыми стандартной библитекой и самим языком.
Да почему должен? Может быть 100500 различных контейнеров заточенных под конкретную задачу, а вы меня хотите ограничить коллекциями из stl. :)

Пользовался, представьте себе, и не раз. И именно поэтому пишу здесь про недостатки, которые сам заметил.
Скажем так, это не недостатки, а неудобства stl лично для вас. Я не считаю ваши неудобства недостатками stl. :)

Понятия не имею, что такое "правила cron" :) Поэтому, не зная контекста, судить не могу.

Оно выглядит примерно так:
0 10 */4 1-5 *

и означает, что событие будет происходить в любой день недели, с января по май, каждый четвертый день в 10:00.

Секции разделены пробелами, каждая секция означает (с лево на право):
минуты (0-59)
часы (0-23)
дни (1-31)
месяцы (1-12)
дни недели (0-6)

каждая секция может содержать через запятую:
конкретное значение: 1,4,12
диапазон: 1-12
диапазон с делителем: 0-10/2
звездочку: * - означает все значения
звездочку с делителем: */10

примеры секций:
1,2,3,6-10,12-20/2,25,27
*/12
0-20/4,21-40/2,45


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 11, 2016, 14:15
Цитировать
Серьёзно? А если мне вдруг будет необходимо передать определённый range?

Хм... я, по моему, не предлагал отказываться от range нигде, кроме регэкспов. Я предложил РАСШИРИТЬ API алгоритмов так, чтобы можно было передавать не итераторы, а контейнеры в целостном виде. Вот что Вам проще будет написать:

std::some_alg1(a.begin(), a.end(), b.begin());
std::some_alg2(b.begin(), d.end(), c.begin());
std::some_alg3(c.begin(), c.end(), d.begin());

или

std::some_alg1(a, b);
std::some_alg2(b, c);
std::some_alg3(c, d);

Вам первый вариант с итераторами кажется проще и читабельней? Правда?


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 14:19
Покажите пожалуйста как это выглядело бы в "общем виде" и как этим "полным решением" пришлось бы пользоваться. Спасибо
Пожалуйста.
http://www.boost.org/doc/libs/1_60_0/doc/html/string_algo/usage.html#idm45555128686640


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 14:21
Я предложил РАСШИРИТЬ API алгоритмов так, чтобы можно было передавать не итераторы, а контейнеры в целостном виде.
Я за.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 11, 2016, 14:42
Пожалуйста.
http://www.boost.org/doc/libs/1_60_0/doc/html/string_algo/usage.html#idm45555128686640
Там пишут
Цитировать
Container parameters: Unlike in the STL algorithms, parameters are not specified only in the form of iterators. The STL convention allows for great flexibility, but it has several limitations.
Хмм...  :)

Да, и вот еще
Цитировать
It is considerably easier to write to_lower(str1), than to_lower(str1.begin(), str1.end()).
И я так считаю  :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 14:50
Там пишут
Так и что? :)
boost песочница для stl, они пробуют разные подходы, разные концепции.
Окажется концепт удобным, возможно попадет в стандарт, нет - останется в boost с попытками его улучшить.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 14:53
И я так считаю  :)
И я. И Racheengel. И, думаю, m_ax. И еще 100500 программистов...
Но мы, к сожалению (а может радости), не в комитете. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 11, 2016, 16:25
Цитировать
Хм... я, по моему, не предлагал отказываться от range нигде, кроме регэкспов. Я предложил РАСШИРИТЬ API алгоритмов так, чтобы можно было передавать не итераторы, а контейнеры в целостном виде.
Ну так что Вам мешает это сделать? 

Цитировать
Вам первый вариант с итераторами кажется проще и читабельней? Правда?
В каком то смысле да, поскольку я сразу вижу, что алгорит работает с двуля последовательностями, вижу range который передаётся. 
Но опять же, у Вас все претензии к stl сводятся, фактически к Вашим личным предпочтениям, даже не смротря на то, что Вы легко можете реализовать соответствующие перегрузки для необходимых алгоритмов.   


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 11, 2016, 16:45
Цитировать
Да за этим бы дело не стало, но Вы же сами видите что хороший код здесь не получить, по той простой причине что std на это не рассчитан.
Ну это спорно..
Вообще Racheengel сказал чего хочет. Что плохого в этом коде:
Код
C++ (Qt)
template <class Container>
void some_algorithm(const Container & c)
{
   std::some_algorithm(c.begin(), c.end());
}
 
 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 11, 2016, 16:54
Ну так что Вам мешает это сделать?  

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

Что плохого в этом коде:
Код
C++ (Qt)
template <class Container>
void some_algorithm(const Container & c)
{
   std::some_algorithm(c.begin(), c.end());
}
 
 
То что его надо писать всякий раз, причем в 2 вариантах: с функтором и без. Впрочем многие так и делают - лучшего-то нет

На всякий случай напомню мое предложение
Цитировать
QString & QString::replace(const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
Покажите пожалуйста как это выглядело бы в "общем виде" и как этим "полным решением" пришлось бы пользоваться. Спасибо
Не хотите ответить? Ну как хотите, я даже знаю почему :) И еще разок с удовольствием процитирую буст
Цитировать
Container parameters: Unlike in the STL algorithms, parameters are not specified only in the form of iterators. The STL convention allows for great flexibility, but it has several limitations. It is not possible to stack algorithms together, because a container is passed in two parameters. Therefore it is not possible to use a return value from another algorithm. It is considerably easier to write to_lower(str1), than to_lower(str1.begin(), str1.end()).

The magic of Boost.Range provides a uniform way of handling different string types. If there is a need to pass a pair of iterators, boost::iterator_range can be used to package iterators into a structure with a compatible interface.
Как видите даже городится адаптер чтобы использовать контейнеры (а не итераторы). И это правильно


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 11, 2016, 17:38
Цитировать
На всякий случай напомню мое предложение

Покажите пожалуйста как это выглядело бы в "общем виде" и как этим "полным решением" пришлось бы пользоваться. Спасибо
Пожалуйста:
Код
C++ (Qt)
template <class T>
using range = std::pair<T, T>;
 
template <class T>
range<typename T::const_iterator> make_range(const T & src)
{
   return range<typename T::const_iterator>(std::begin(src), std::end(src));
}
 
template <class T1, class It1, class It2>
T1 replace(const T1 & src, const range<It1> & before, const range<It2> & after)
{
...
}
 
И использование:
Код
C++ (Qt)
std::list<int> src = {1,2,3,4,5,6,7,8,9, 10};
std::vector<int> before = {2,3,4};
std::array<int, 5> after = {-2,-3,-4,-5,-6};
 
auto out = replace(src, make_range(before), make_range(after));
 
Отмечу, что по своему смыслу в replace в качестве исходной последовательности нельзя передавать range. Поскольку это чревато ошибками из-за особенностей реализации алгоритма (например, может потредоваться аллоцирование и копирование данных).  


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 20:13
Перегрузка для каждого алгоритма с полным основанием должна быть признана "костылем".
Вот если бы в алгоритм передавался контейнер, и мне приходилось бы для обработки части контейнера копировать этот кусок во временный для передачи в алгоритм, вот это был бы костыль.
А сейчас, как правильно заметил Racheengel, есть маленькое неудобство, что в алгоритмы нельзя передать весь контейнер, и это неудобство легко обходиться как уже не раз показал m_ax.
Сделать из общего частное легко, вот сделать наоборот очень сложно.

Как видите даже городится адаптер чтобы использовать контейнеры (а не итераторы). И это правильно
Это библиотека строковых алгоритмов, в ней передача в качестве параметра строки это естественный шаг. Алгоритмы stl не предназначены для строк, строка в них это скорее частный случай.
И что там стало "правильным"? Как только мне понадобится работать с частью строки, мне все равно придется задавать диапазоны. Что я в открытую укажу итераторами начало и конец последовательности, что спрячу их же в range. Ничего не поменяется, вернемся к тому же самому.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 11, 2016, 20:47
Вот, думается мне, что бы было еще более правильным - некая сущность типа "виртуального контейнера". Ну то есть ему можно сказать, кого он виртуализирует, а также с какого по какой элемент. Т.е. некий ContainerView, который существует "над" реальным с нулевым оверхедом...


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 11, 2016, 20:53
Цитировать
Хм... я, по моему, не предлагал отказываться от range нигде, кроме регэкспов. Я предложил РАСШИРИТЬ API алгоритмов так, чтобы можно было передавать не итераторы, а контейнеры в целостном виде.
Ну так что Вам мешает это сделать? 

Я то могу нагородить адаптеров, это не проблема. Но проблема в другом - что мне приходится городить адаптеры для 90% СЛУЧАЕВ ИСПОЛЬЗОВАНИЯ. А это я считаю неправильным по отношению к пользователям.

Цитировать
Вам первый вариант с итераторами кажется проще и читабельней? Правда?
В каком то смысле да, поскольку я сразу вижу, что алгорит работает с двуля последовательностями, вижу range который передаётся. 

:) а я ведь намеренно допустил ошибку в своём примере:

std::some_alg1(a.begin(), a.end(), b.begin());
std::some_alg2(b.begin(), d.end(), c.begin());
std::some_alg3(c.begin(), c.end(), d.begin());

И, полагаю, никто её не заметил, включая компилятор :)
Чего бы не случилось, используй я вариант с контейнерами.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 20:54
Вот, думается мне, что бы было еще более правильным - некая сущность типа "виртуального контейнера". Ну то есть ему можно сказать, кого он виртуализирует, а также с какого по какой элемент. Т.е. некий ContainerView, который существует "над" реальным с нулевым оверхедом...
Во время решения именно этой задачи появились итераторы. Как мне кажется, специализация такого view была бы куда более сложной, чем указание begin и end.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 11, 2016, 20:58
И, полагаю, никто её не заметил, включая компилятор :)
Я заметил. Но в С++ таких ошибок может быть по десять в строке и программа будет замечательно компилироваться и даже работать. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 11, 2016, 22:11
И, полагаю, никто её не заметил, включая компилятор :)
Я заметил. Но в С++ таких ошибок может быть по десять в строке и программа будет замечательно компилироваться и даже работать. :)

Ну а так хоть на пару проблем будет меньше) Это не может не радовать)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 12, 2016, 08:34
А сейчас, как правильно заметил Racheengel, есть маленькое неудобство, что в алгоритмы нельзя передать весь контейнер,
При интенсивном использовании любое неудобство становится не маленьким

..и это неудобство легко обходиться как уже не раз показал m_ax.
Я бы не сказал что "легко" :) Бросается в глаза неестественность этой конструкции. Что мы ищем (на что меняем)? Строку(и) - ну значит их и надо подавать (хоть с template хоть явно). Но мы упорно стремимся к "паре итераторов". Зачем? Из-за мнимой общности. Вот кто-то может и не иметь метода size(), а вот std::distance должно(?) вернуть всегда. Даже если и так - никто не мешал сразу соскочить на итераторы в начале реализации. Зачем надо было калечить вызов?

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

Почему все должно быть примитивным "диапазоном" задаваемым парой итераторов - хз. Гораздо естественнее "все может быть контейнером", это по крайней мере элегантно. Вот правда как буст это делает - увы, сходу понять не удалось :'( Ну ничего.

И использование:
Код
C++ (Qt)
std::list<int> src = {1,2,3,4,5,6,7,8,9, 10};
std::vector<int> before = {2,3,4};
std::array<int, 5> after = {-2,-3,-4,-5,-6};
 
auto out = replace(src, make_range(before), make_range(after));
 
Хорошо. Правда не знаю как "только с итераторами" вернуть контейнер, но мой вопрос был не об этом. Но, елы-палы, кому (или на хрена) нужна такая общность? Когда мне приходилось что-то менять в массиве/контейнере int? Не помню. Да, Вы достигли цели и показали что можете менять "что угодно" - признаю. Но с точки зрения практика это достижение, ну, скажем, "невелико". И наоборот, то что Вы считаете "мелкой деталью" (так, немного поменять аргументы) для него очень важно, и Вы бы услышали немало эпитетов в свой адрес - и совсем не лестных  :)

Мне кажется Вы замкнулись в схоластическом мире (или "мирке") теории и напрасно тратите свое время на абстрактные финтифлюшки. Прикладное программирование (по-простому - решение разнообразных задач) предоставляет гораздо больший простор для фантазии/самовыражения.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 12, 2016, 09:01
При интенсивном использовании любое неудобство становится не маленьким
Так исправьте это неудобство - напишите удобные для вас враперы.

Зачем? Из-за мнимой общности.
А в чем ее мнимость? Покажите ее ограничения.

В конце-концов сам буст ясно говорит что, по крайней мере в некоторых случаях, итераторы не обеспечивают нужного ф-ционала и надо юзать контейнеры (тут один знаток как-то засомневался :)).
Буст ничего не говорит. boost это сборник 100500 библиотек написанных 100500 программистами. Если разработчик одной из них, посчитал, что для работы со строками удобней в качестве параметров передавать именно строки, то это его право. В этом действительно, что-то есть. :)
Но это вовсе не означает, что это отличная идея для всего остального. Скорее наоборот.

Почему все должно быть примитивным "диапазоном" задаваемым парой итераторов - хз. Гораздо естественнее "все может быть контейнером", это по крайней мере элегантно.
Только не эффективно. Если мне понадобиться только часть контейнера, мне придется эту часть вырезать в отдельный.

Но, елы-палы, кому (или на хрена) нужна такая общность? Когда мне приходилось что-то менять в массиве/контейнере int? Не помню.
А в контейнере точек вам приходилось что-то менять? Так он ничем не отличается от массива интов.

Да, Вы достигли цели и показали что можете менять "что угодно" - признаю. Но с точки зрения практика это достижение, ну, скажем, "невелико". И наоборот, то что Вы считаете "мелкой деталью" (так, немного поменять аргументы) для него очень важно, и Вы бы услышали немало эпитетов в свой адрес - и совсем не лестных  :)
Надо такому "практику" подучиться и у него все начнет получаться. Он сам сможет упрощать неудобные для него вещи (а не ждать, что кто-то ему что-то упростит) и эпитеты его будут переадресованы себе. :)
Не надо сложности каждого практика-недоучки выдавать за всеобщие проблемы. У C++ множество проблем, но итераторы не входят в их число или расположены в самом конце. :)

Мне кажется Вы замкнулись в схоластическом мире (или "мирке") теории и напрасно тратите свое время на абстрактные финтифлюшки. Прикладное программирование (по-простому - решение разнообразных задач) предоставляет гораздо больший простор для фантазии/самовыражения.
Я чуть выше привел задачу с правилами cron, попробуйте ее решить с помощью "прикладного программирования", а я покажу как я ее решил с помощью абстрактных финтифлюшек. И сравним за сколько вы ее решите и посмотрим на это решение.
У меня это решение используется в "ядре комплекса" и там нет Qt. Но понимая, что без QString эта задача вообще не решиться, то пусть будет QString. :)

Для меня скорость получения решений и их надежность очень важна, у меня жесткие сроки разработки. Я не могу на каждый маленький чих (типа разбора правил cron) тратить по несколько дней на свой финдреплейс.
Мне большую задачу надо сдавать. Никто не оценит, что мы написали разбор правила за несколько дней без буста и поэтому нам не хватило времени закончит всю систему. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 12, 2016, 11:53
Я чуть выше привел задачу с правилами cron, попробуйте ее решить с помощью "прикладного программирования", а я покажу как я ее решил с помощью абстрактных финтифлюшек. И сравним за сколько вы ее решите и посмотрим на это решение.
Судя по тому что Вы привели - там "разборок" на час отсилы. Вот научитесь себя вести корректно - тогда может и покажу как :) А пока свободен.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 12, 2016, 12:00
Судя по тому что Вы привели - там "разборок" на час отсилы. Вот научитесь себя вести корректно - тогда может и покажу как :) А пока свободен.
Ну другого ответа я и не ожидал. :)
Оно когда число из строки достать, то вы первый показыватель, а как что сложней, сразу слив. :) Понимаю, потратить несколько дней что бы отладить свою лапшу тратить не хочеться.
А так да, я свободен. У меня не вызывают проблемы использовать C++, хоть он и не "красавица". :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 12, 2016, 12:31
Ну, эти правила действительно достаточно просты, и там можно обойтись и без регулярок.
Я не говорю, что регулярки зло - наоборот, я время от времени тоже ими пользуюсь.
Более того, у меня есть пара друзей - программистов, которые иногда просят меня написать им ту или иную регулярку (хотя я совсем не спец в них!)
Они правда хорошие специалисты (немного другая область софт-инженерии, но все же), но вот про регулярки говорят, что понять это невозможно.
Просто человек, который спец по регуляркам, сделает решение на их основе.
А человек, который с ними не сталкивался - ему будет быстрее применить свои знания для собственного решения.
Так думаю.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 12, 2016, 12:40
Ну, эти правила действительно достаточно просты
Мне такой срок реализаци (2-3 дня) объявил мой гном, который должен был писать шедулер. В это время, другой гном, просто бы курил.
На это я пойти-ть никак не мог, поэтому отложив пасянчик, за пару часов, вспомнив спирит, я написал шедулер сам. :)

и там можно обойтись и без регулярок.
Несомненно.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 12, 2016, 13:56
А человек, который с ними не сталкивался - ему будет быстрее применить свои знания для собственного решения.
Совершенно верно. Ничего не имею против регулярок, но как-то "не сложилась любовь". Не раз когда возникала очередная разборка я посматривал в их сторону (ну все-таки не зря же люди придумали). Но всякий раз меня останавливало вот это
Цитировать
Note that in general regexps cannot be used to check for balanced brackets or tags.
А у меня этот баланс всегда был - и экранирование всякими кавычками тоже. Наконец пару лет назад была задачка (здесь где-то есть следы) очень похожая на переименование файлов, напр
Цитировать
ren a*.gif b*.bmp
Ну думаю, наконец-то освою могучую технологию! Ни фига, выяснилось что здесь регулярка не подходит  :'(

Не, конечно если б подходящие задачи лились бурным потоком - вывчыв бы (куда делся). А так, "раз в неск лет" - точно успею забыть все что учил, смысла нет. Велик выходит и дешевле и быстрее


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 12, 2016, 14:42
А человек, который с ними не сталкивался - ему будет быстрее применить свои знания для собственного решения.
Быстрее по сравнению с чем?
За кажущейся простотой задачи разбора, скрывается огромное число проверок, которые нужно реализовать и отладить. И именно это занимает большую часть времени.
Для некоторых задач, проще и быстрее разобраться с регулярками, чем велосипедить свое решение. Не хотите правила cron, давайте другой пример - номера телефонов, что бы они разбирались при любом написании. На сколько дольше их будет делать человек без регулярок, по сравнению с регулярщиком? На недели? Насколько это решение будет расширяемым? :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 12, 2016, 16:00
Для некоторых задач, проще и быстрее разобраться с регулярками, чем велосипедить свое решение.
Для некоторых да - а для некоторых нет

Не хотите правила cron,
Мне эти правила не кажутся сложными, но я не собираюсь чего-то доказывать "залупистому сеньору" который обзывает меня недоучкой.

давайте другой пример - номера телефонов, что бы они разбирались при любом написании. На сколько дольше их будет делать человек без регулярок, по сравнению с регулярщиком? На недели? Насколько это решение будет расширяемым? :)
Вы уже раз 5 вспоминаете об этих мифических телефонах :) Создайте тему, внятно изложите условие задачи - а там посмотрим насколько дольше (или короче).


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 12, 2016, 16:18
Для некоторых да - а для некоторых нет
Ну так не узнав по настоящему, что такое регулярки, вы никогда не сможете определить подходят они в данном случае или не подходят.

Мне эти правила не кажутся сложными
Да они примитивные.

но я не собираюсь чего-то доказывать "залупистому сеньору" который обзывает меня недоучкой.
Что с наскоку не получилось? Понимаю. :)
Давайте дождемся очередного новичка, которому понадобится из строки числа доставать. Вот там вы раскроетесь. :)
А так да, вы важно назвали себя практиком, тем самым определив меня в теоретики (?) и это вас нисколько не смутило. :)
А то, что я вас назвал недоучкой, который не умеет пользоваться итераторами, но считает их не нужными, вас задело до глубины души. Следите в первую очередь за своими словами.

Вы уже раз 5 вспоминаете об этих мифических телефонах :) Создайте тему, внятно изложите условие задачи - а там посмотрим насколько дольше (или короче).
Зачем мне тему создавать?
А мифические телефоны, это обычные номера телефонов, которые могут записываться и так:
+79001234567
и так
89001234567
и так
+7 900 1234567
+7 (900) 123-45-67
8(900) 12-345-67
и еще кучей разных способов. Но это не любые 11 цифр. Начинаться номер телефона может с +7 или 8. Код может быть в скобках, а может и не быть. Разделяться они могут пробелами или "-".
Вот любитель регулярок решит эту задачу за несколько минут, сколько понадобится времени вам, сколько вы будете его отлаживать, насколько вы будете уверены в его корректной работоспособности? А ведь это просто номера телефонов. А если нужно будет искать паспортные данные, названия книг и т.д.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: gil9red от Июнь 12, 2016, 18:28
Вот любитель регулярок решит эту задачу за несколько минут, сколько понадобится времени вам, сколько вы будете его отлаживать, насколько вы будете уверены в его корректной работоспособности? А ведь это просто номера телефонов. А если нужно будет искать паспортные данные, названия книг и т.д.


Убрать все символы, кроме чисел, если нужно первую 7-ку или 8-ку заменить и все :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 12, 2016, 18:32
Убрать все символы, кроме чисел, если нужно первую 7-ку или 8-ку заменить и все :)
Вот это не номер телефона:
8900(123)4567


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 12, 2016, 18:38
Ну, для проверки на корректность нужна база данных кодов регионов и городов)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 12, 2016, 19:45
Ну, для проверки на корректность нужна база данных кодов регионов и городов)
Да тут бы удостовериться, что это код. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: m_ax от Июнь 12, 2016, 20:12
Цитировать
Да, Вы достигли цели и показали что можете менять "что угодно" - признаю. Но с точки зрения практика это достижение, ну, скажем, "невелико".
Для практика, который пишет исключительно для себя/под себя здесь и сейчас, а завтра забудет об этом, да, не велико.. Навиг ему думать об архитектуре, расширяемости и проч вздорах)
Ему не нужно изучать какие то концепты, технологии: у таких практиков очень инертное мышление, находящееся между несдвигаемыми рамками тех начальных представлений который он успел получить) Но мир не стоит на месте, прогресс достигается во многом из-за синтеза и конкуренции разных подходов и концепций и иногда даже самых безумных на первый взгляд)

Так что нахожку нижеследующее
Цитировать
Мне кажется Вы замкнулись в схоластическом мире (или "мирке") теории и напрасно тратите свое время на абстрактные финтифлюшки. Прикладное программирование (по-простому - решение разнообразных задач) предоставляет гораздо больший простор для фантазии/самовыражения.
 
весьма наивным)

  


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 13, 2016, 09:35
..и еще кучей разных способов.
Ну вообще-то это не постановка. Ладно, додумал сам, надеюсь разумно (аттач)

Вот любитель регулярок решит эту задачу за несколько минут, сколько понадобится времени вам,
Мне времени понадобилось немного, а вот решений на регулярке я почему-то не вижу.

Кто любит регулярки - пусть юзает на здоровье. Но вот не надо рассказывать что "без них ну никак", что иначе разбор превратится в кромешный ад, займет недели(!) и.т.п. Все это сказки про белого бычка. Да, придется чуть посидеть, да, будет может не так коротко как "колбаса" регулярки. Но никакой катастрофы не случится, это ведь всего лишь задачка уровня студенческой лабы которую можно написать в лоб, без всяких затей. И это кстати полезная тренировка

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


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 13, 2016, 09:55
Ему не нужно изучать какие то концепты, технологии: у таких практиков очень инертное мышление,  
Последние полгода занимаюсь character animation на базе большой open-sources либы. И концептов и технологий предостаточно. Писалось многими людьми, задействовано много др либ, но вот не помню ни одной ф-ции/метода с "парой итераторов"  :)

А тут блин.. std::copy, std::transform, std::for_each и.т.п. Сколько там еще перепевов того что можно исполнить обычным оператором for? Да, иногда можно записать короче, выразительное, ясно, спасибо. Но "цена вопроса"-то копеечная. И, как всякая система, она репродуцирует себя. Итераторы такие и сякие - это как-то становиться важным и предметом тщательного изучения. Вас не смущает ничтожность цели (или ее полное отсутствие)?
Цитировать
Куда идем: в Москву или в Монголию?  :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 13, 2016, 10:21
Ну вообще-то это не постановка. Ладно, додумал сам, надеюсь разумно (аттач)
Ну слава Богу. :)

Мне времени понадобилось немного, а вот решений на регулярке я почему-то не вижу.
Я надеюсь, что вы не ночь на это убили, это же всего лишь телефоны.
А вот регулярка (первая попавшаяся в интернете) : ((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}

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

Да, придется чуть посидеть, да, будет может не так коротко как "колбаса" регулярки. Но никакой катастрофы не случится, это ведь всего лишь задачка уровня студенческой лабы которую можно написать в лоб, без всяких затей. И это кстати полезная тренировка
Но только заказчику не нужны решенные лабы, ему нужен конечный продукт, а он получается когда решаться все 100500 таких маленьких задач, причем быстро и надежно.

Как все-таки права народная мудрость: не трогай говно, обойди. Нет опять меня угораздило, достал "великой задачей о телефонах".
Очень права, и когда вас по макаешь в ваше же гавно ваш нарциссизм уходить, жаль что всего лишь на время. Вы всего лишь жалкий неумеха, который написанием постов на форуме пытается самоутвердится в своих глазах. Но мы здесь не для лечения ваших комплексов. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 13, 2016, 10:25
Итераторы такие и сякие - это как-то становиться важным и предметом тщательного изучения.
Итераторы примитивны, их не надо тщательно изучать. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 13, 2016, 10:29
Последние полгода занимаюсь character animation на базе большой open-sources либы. И концептов и технологий предостаточно. Писалось многими людьми, задействовано много др либ, но вот не помню ни одной ф-ции/метода с "парой итераторов"  :)
Вы бы ссылочки на ваши либы показали, глядишь и найдется чего.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 13, 2016, 13:52
А у меня 100500 таких задач, многие из которых на этапе разработки будут уточняться.
Если 100500 - то чего ж Вы про одни и те же телефоны неск лет напоминали?  :)

Я надеюсь, что вы не ночь на это убили, это же всего лишь телефоны.
Нет, примерно полчаса

А вот регулярка (первая попавшаяся в интернете) : ((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}
Не понял, так что, Ваших познаний в регулярках оказалось недостаточно и пришлось искать подходящую в инете?

Очень права, и когда вас по макаешь в ваше же гавно ваш нарциссизм уходить, жаль что всего лишь на время. Вы всего лишь жалкий неумеха, который написанием постов на форуме пытается самоутвердится в своих глазах. Но мы здесь не для лечения ваших комплексов. :)
Такие аргументы никогда никого не убеждают :) И "мыкать" не надо, Вы не представитель общественности. И склочничайте грамотнее

нарциссизм (что делает?) уходит // без мягкого знака
пытается (что сделать?) самоутвердиться // а здесь с мягким

А лучше вообще не скандалить. Считаете меня глупым - не тратьте на меня попусту время и слова, так Вы только себе настроение портите  :) 


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 13, 2016, 14:34
Если 100500 - то чего ж Вы про одни и те же телефоны неск лет напоминали?  :)
Это у вас просто память короткая или вы выбрали самое простое для себя. :)
Перед этим были правила cron. Но тут результат будет такой же, как и с телефонами: совершенно не расширяемый одноразовый велосипед, состоящий из лапши и в 100 раз длиннее решения на spirit. :) 

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

Такие аргументы никогда никого не убеждают :)
Какие такие? :)

И склочничайте грамотнее
Ну вы хоть русский язык осилили. :)

Считаете меня глупым
Глупым? Нет. Скорее ограниченным самим собой.
Вы из всего разнообразия доступных инструментов выбрали один молоток, которым и пытаетесь что-то делать.
А все остальные инструменты вызывают у вас ужас, хотя вы даже не пытались с ним разобраться.

так Вы только себе настроение портите  :) 
Когда я ставлю на место зарвавшегося хама у меня всегда отличное настроение. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 13, 2016, 15:16
Вы из всего разнообразия доступных инструментов выбрали один молоток, которым и пытаетесь что-то делать.
А все остальные инструменты вызывают у вас ужас, хотя вы даже не пытались с ним разобраться.
У меня переизбыток того с чем надо разбираться. А тратить время на изучение инструмента/технологии которая нужна в году раз - считаю непрофессиональным. И владение молотком еще никому не мешало.

Когда я ставлю на место зарвавшегося хама у меня всегда отличное настроение. :)
Вы что, воображаете что опустившись до оскорблений и лжи Вы тем самым что-то доказали? Ну разве только что Вы - да-да, вот то самое что лучше обойти :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 13, 2016, 15:21
Жалко, что нету кнопки "Move to Sratsch" :(


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 13, 2016, 15:26
А тратить время на изучение инструмента/технологии которая нужна в году раз - считаю непрофессиональным.
С таким подходом никакие технологии не нужны. Не разобравшись с технологией вы никогда не поймете, когда она нужна. Вам и регулярки нужны раз в год, только потому что вы понятия не имеете, что они могут.

И владение молотком еще никому не мешало.
Конечно не мешало, но пора бы узнать и экскаватор с лазерным дальномером. :)

Вы что, воображаете что опустившись до оскорблений и лжи Вы тем самым что-то доказали? Ну разве только что Вы - да-да, вот то самое что лучше обойти :)
Ну-ка, где я лгу?
А до оскорблений опустились вы, так же как и сейчас. Только сейчас вы оказались скромнее. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: poru от Июнь 14, 2016, 11:50
Знатный холивар  :)

Кстати в нашем кружке "умелые руки", как и в некоторых по соседству, крайне не в почете stl, boost и всякого рода templat'ы, если нет на то серьезного обоснования. Не всякий кодер знает или помнит возможности той или иной либы, тех или иных технологий и да же возможностей языка, учитывая, что код должен быть прост и лаконичен. Из дискуссии я в большей степени поддерживаю Racheengel и Igors.

Про регулярки. Применил я их как-то для верификации протокола обмена. Пришел новенький и дали ему что-то там изменить. И как говорил Old, переписать этот кусок кода было быстрее, чем научить новичка регуляркам.  Это опять в пользу первого пункта. Писать надо не для компьютера, а для человека, который будет разбираться в этом коде после тебя (это камушек в огород! буста).

По теме. Каждый предложил свое решение. На регулярках. При этом не указав автору, что он заблуждается, утверждая, что:
Цитировать
Обрабатывать нужно именно регулярными выражениями. Потому что, например, парсинг в DOM (с последующим обратным преобразованием) не сделает текстовую ноду из одних пробелов внутри ноды span.
Мое мнение, если это DOM-документ, то и работать надо с ним методами DOM, учитываю возможную расширяемость, если конечно это не разовая задача.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 14, 2016, 12:04
Пришел новенький и дали ему что-то там изменить.
Вот это и вызывает большое сожаление. :(
В 80-х мы старались писать красивый код, использовать новые и интересные подходы, пробовали, по сегодняшним меркам, безумные штуки, экспериментировали...
А сейчас мы вынуждены делать код для средних программистов и надеяться, что завтра его сможет разобрать еще менее квалифицированный "специалист". :(
Поэтому, раньше были редакторы кода (почти IDE) с подсветкой кода для нескольких языков, умещающийся в 64Кб, а сейчас IDE на 4Гб тупит и требует 8. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 14, 2016, 12:14
Пришел новенький и дали ему что-то там изменить.
Вот это и вызывает большое сожаление. :(

Тут сожаление больше вызывает другое - что используемая технология была сделана "не для людей" и поэтому данный факт привел к печальным последствиям.

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

Но сейчас уже 21 век, а не 70-е годы :)
Нельзя жить прошлым, надо двигаться вперед. И если технологии застряли в 70-х годах (а API STL и Boost исходят именно оттуда), то это не значит, что их надо тащить в светлое будущее :)

Поэтому, раньше были редакторы кода (почти IDE) с подсветкой кода для нескольких языков, умещающихся в 64Кб, а сейчас IDE на 4Гб тупит и требует 8. :)

Тут проблема больше во всяких жабах-дотнетах, которые сами по себе требуют значительных ресурсов. А ресурсы есть, поэтому программисты и забывают про ценность каждого байта... Да и мозги частенько питонами и жабами испорчены...

(Сам когда-то "экономил" на байтах, когда еще под контроллеры и Z80 писал - чистый ассемблер, никаких классов :) Да и сейчас стараюсь "следить за жиром" - как можно меньше третьесторонних либ и копипасты в проекты.)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 14, 2016, 12:21
Тут сожаление больше вызывает другое - что используемая технология была сделана "не для людей" и поэтому данный факт привел к печальным последствиям.
Эта технология сделана для C++. Да, он многословен и тяжел, но лучше пока ничего нет. Точнее есть, но для групповой разработки не подходит. :)

Но сейчас уже 21 век, а не 70-е годы :)
А я, как раз, и не живу. :) Я имею представления о большинстве современных технологии и многими умею пользоваться. А если мне понадобится экспертное владение какой-то, то я его быстро получу.

И если технологии застряли в 70-х годах (а API STL и Boost исходят именно оттуда), то это не значит, что их надо тащить в светлое будущее :)
Нет, boost и stl моложе Qt. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 14, 2016, 12:27
Стандартная библиотека C++ появилась в 1983 году.
Первый релиз Qt: 1995 год.


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Old от Июнь 14, 2016, 12:34
Стандартная библиотека C++ появилась в 1983 году.
Первый релиз Qt: 1995 год.
В 83 году в stl еще ничего не было из "неудобного для вас". Это все появилось гораздо позже. :)


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 14, 2016, 18:06
Но сейчас уже 21 век, а не 70-е годы :)
Нельзя жить прошлым, надо двигаться вперед. И если технологии застряли в 70-х годах (а API STL и Boost исходят именно оттуда), то это не значит, что их надо тащить в светлое будущее :)
Да, такие мысли/соображения "витают в воздухе". Не раз видел рекламы новых языков которые хотят показаться в выгодном свете сравнивая себя с плюсами. Мол, в плюсах довольно высокий порог вхождения, а вот мы... Объем написанного на плюсах огромен, поэтому думаю минимум еще лет десять ему ничего не грозит. С др стороны не видно бурного (или хотя бы бодрого) развития, скорее мышиная возня в деталях синтаксиса. Что несколько удручает  :'(


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Racheengel от Июнь 14, 2016, 23:38
Как по мне - самое важное, что появилось в new-C++ - это auto :)
Остальное - мелочь какая-то... Язык умирает, к сожалению :(
Хотя да, лет 10-15 проживет, думаю. А "новоявленные языки" типа Rust и прочих Каклинов - сегодня есть, завтра нет.

ЗЫ. Всегда раздражала необходимость добавлять слово template<...> в имплементацию темплейтных методов...
Разве компилятор настолько туп, что не может это сам разрулить ???


Название: Re: Как заменить неизвестное заранее число вхождений в QRegExp ?
Отправлено: Igors от Июнь 15, 2016, 10:46
Вообще типизированный контроль - это хорошо. Но недостаточно гибко - тоже верно, поэтому начались игрища со всякими "мета". Тогда другая беда - без типа хрен поймешь что функтор должен делать. Вот если бы его можно было как-то описывать...