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

最佳答案

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

顺便说一句,我永远不会在“永不这样做”这样的措辞中加入这样的指导方针。事实是,
一旦存储了正则表达式,就不可能每次都意外地重新编译它
(如果存储它,但是忘记了static const和标志,以使正则表达式保持其已编译状态机等)

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

关于c++ - “ALWAYS use a named regex, NEVER a temporary”-为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5604796/

10-10 03:50