我的regex_iterator中有大约一百万个条目,并且会有重复项。为了使我能够在regex_iterator上进行sort()和unique()本身(它本身不需要花费很多时间),我需要将其复制到花费大量时间(约20秒)的 vector 中。我的代码将正则表达式应用于文件内容(字符串fcontent),然后使用push_back将匹配项逐一添加到 vector 中。

vector<string> vthread;
std::regex e(R"(\{\w+:\d\})", std::regex::ECMAScript|std::regex::icase);
std::regex_iterator<std::string::iterator> rit(fcontent.begin(), fcontent.end(), e);
std::regex_iterator<std::string::iterator> rend;
while (rit != rend) {
    vthread.push_back(rit->str());
    ++rit;
}
std::sort(vthread.begin(),vthread.end());
vthread.erase(unique(vthread.begin(),vthread.end()),vthread.end());
上面的push_back既耗费CPU又耗时。寻找替代和有效的方法。谁能帮忙吗?

最佳答案

regex_iterator很懒。 rit的构造仅找到第一个匹配项,而++rit的发现随后的匹配项。我怀疑push_back是瓶颈。
调用rit->str()会分配一个从fcontent复制的新字符串,如果改为使用rit->position()rit->length()来构建 std::string_view (C++ 17),则可以避免这种情况。

关于c++ - C++:将reg_iterator复制到 vector 中以便进行sort()和unique()吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64098375/

10-11 00:56