我的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/