c++ - 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 和耗时。寻找替代且有效的方法。有人可以帮忙吗?
解决方案
Aregex_iterator
是懒惰的。的构造rit
只找到第一个匹配项并++rit
找到后续匹配项。我怀疑这push_back
是一个瓶颈。
调用rit->str()
分配从 复制的新字符串,如果您使用and来构建(C++17) fcontent
,则可以避免这种情况。rit->position()
rit->length()
std::string_view
推荐阅读
- python - Lustre 文件系统上有多个读取器的 SQLite“磁盘 I/O 错误”
- python - 如何计算 Python 中包括结尾新行在内的行数?
- python - Nornir:将 Python 函数传递给 Jinja2 模板
- loops - Haskell中的双重for循环
- javascript - 调用一个正在获取 API 并呈现返回值的函数,Promises 的问题
- reactjs - 如何在 React MUI 中设置卡片样式?包括沙盒
- javascript - 当圆圈改变大小时缩放图像图案
- python - 从 While 循环创建一个新的 .CSV 文件
- c - 为什么我的函数不会被读取?我只是得到“错误:调用对象'FunctionName'不是函数或函数指针”
- r - pivot_longer summarise_each 的输出,带有 mean 和 sd 函数