【发布时间】:2018-06-27 13:36:07
【问题描述】:
我有一个 unordered_map,它的键和值都是字符串类型。
key 是一个正则表达式。
地图中的元素数量约为 2,50,000。
我必须找到其键(正则表达式)与请求中收到的字符串完全匹配的元素。
当我按每个元素遍历地图时,在最坏的情况下大约需要 10 秒。
我的示例代码:
string string_to_match = "Find my Regex";
for (MyMap::const_iterator it = myMap.begin();
it != myMap.end(); ++it) {
//cout << it->first << "\n";
if (regex_match( string_to_match ,
regex(it->first,std::regex::ECMAScript | std::regex::icase))) {
cout << ", " << it->second << "\n ";
break;
}
++it;
}
有什么办法可以减少花费的时间...
【问题讨论】:
-
如果订购无关紧要,您可能想试试
std::vector<std::pair<std::regex, std::string>>。您可以从中获得更好的缓存性能。 -
@NathanOliver 与订购有什么关系?
-
正则表达式确实是它们自己的小迷你语言,因此需要对其进行编译。这个编译当然需要一点时间。通过预编译正则表达式而不是在循环中进行,您可以节省大量时间。
-
@PasserBy 如果他们需要对数据进行排序,他们会使用
map而不是unordered_map。由于 OP 使用的是unordered_map,他们似乎并不关心正则表达式的顺序,如果是这种情况,使用vector会做同样的事情,但对缓存更友好。 -
如果进行分析,我的钱将花在
regex_match()上,所以我和@SomeProgrammerDude 在一起。但是,是的,我也会选择std::vector,除非unordered_map正在通过例如find()访问。
标签: c++ regex search unordered-map