UPD:如果使用临时对象,则Stephan's presentation中的示例代码会被破坏:
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;
}
答案 0 :(得分:2)
命名正则表达式(至少有提升)的优点是它只能编译一次。如果正则表达式被多次应用,这是一个性能优势,可以产生很大的不同。
顺便说一下,我从来没有像“从不这样做”这样的措辞那样提出这样的指导方针。事实是,那
存储正则表达式后,每次都不小心重新编译它
(如果你存储但忘记了static const
和标志,以使正则表达式保持其编译状态机等。)
此外,一些正则表达式库甚至会对已编译的regexen进行自动缓存,它使用statiscal(MRU)方法对其进行优化。在某些情况下,这可能比手动保持“命名”正则表达式更好。
答案 1 :(得分:0)
更多地考虑这个问题我已经意识到regex_iterator
的构造函数将引用带到regex
,这当然解释了这个问题。传递对临时对象的引用显然是一个错误。