«ВСЕГДА используйте именованное регулярное выражение, НИКОГДА не временное» - почему? - PullRequest
1 голос
/ 09 апреля 2011

Стефан Т. Лававей в своей презентации регулярных выражений упоминает, что никогда не следует использовать временный объект регулярных выражений.Конечно, я мог бы подумать о некоторых причинах эффективности.Но, похоже, есть более «явные» причины избегать временных объектов.Пример кода перестает работать, как только я заменяю регулярное выражение на временное.Вы знаете, что является точным объяснением этого?

UPD: пример кода из презентации Стефана не работает, если используется временный объект:

const regex r("\\w*day");
string s;
getline(cin, s);

const sregex_iterator end;

// works:
//for (sregex_iterator i(s.begin(), s.end(), r);

// doesn't work:
for (sregex_iterator i(s.begin(), s.end(), regex("\\w*day"));
    i != end; ++i)
{
    cout << (*i)[0] << endl;
}

Ответы [ 2 ]

2 голосов
/ 09 апреля 2011

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

Между прочим, я бы никогда не поставил подобное руководство в формулировках типа «НИКОГДА не делай этого». Правда в том, что После того, как вы сохраните регулярное выражение, все равно невозможно случайно перекомпилировать его каждый раз. (если вы сохраните его, но забудете static const и флаги, чтобы регулярное выражение сохраняло свой скомпилированный конечный автомат и т. д.)

Кроме того, некоторые библиотеки регулярных выражений даже выполняют автоматическое кэширование скомпилированного регулярного выражения, которое использует статический метод (MRU) для его оптимизации. В некоторых случаях это может быть даже лучше, чем вручную сохранять регулярное выражение «named».

0 голосов
/ 16 апреля 2011

Думая о проблеме больше, я понял, что конструктор regex_iterator принимает от ссылку до regex, что, конечно, объясняет проблему. Передача ссылки на временный объект, очевидно, является ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...