“总是使用命名的正则表达式,绝不是临时的” - 为什么?

时间:2011-04-09 11:39:49

标签: c++ regex stl

Stephan T. Lavavej在他的正则表达式中提到了一个人永远不应该使用临时正则表达式对象。我当然可以想到一些效率原因。但看起来有更多“明确”的理由来避免临时对象。使用临时替换命名的正则表达式后,示例代码停止工作。你知道具体的解释是什么吗?

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;
}

2 个答案:

答案 0 :(得分:2)

命名正则表达式(至少有提升)的优点是它只能编译一次。如果正则表达式被多次应用,这是一个性能优势,可以产生很大的不同。

顺便说一下,我从来没有像“从不这样做”这样的措辞那样提出这样的指导方针。事实是,那 存储正则表达式后,每次都不小心重新编译它   (如果你存储但忘记了static const和标志,以使正则表达式保持其编译状态机等。)

此外,一些正则表达式库甚至会对已编译的regexen进行自动缓存,它使用statiscal(MRU)方法对其进行优化。在某些情况下,这可能比手动保持“命名”正则表达式更好。

答案 1 :(得分:0)

更多地考虑这个问题我已经意识到regex_iterator的构造函数将引用带到regex,这当然解释了这个问题。传递对临时对象的引用显然是一个错误。