首页 > 解决方案 > C ++:将reg_iterator复制到向量以便排序()和唯一()?

问题描述

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

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 和耗时。寻找替代且有效的方法。有人可以帮忙吗?

标签: c++

解决方案


Aregex_iterator是懒惰的。的构造rit只找到第一个匹配项并++rit找到后续匹配项。我怀疑这push_back是一个瓶颈。

调用rit->str()分配从 复制的新字符串,如果您使用and来构建(C++17) fcontent,则可以避免这种情况。rit->position()rit->length()std::string_view


推荐阅读