【问题标题】:Regex pattern match search over an un-ordered map in cpp正则表达式模式匹配搜索在 cpp 中的无序映射
【发布时间】: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&lt;std::pair&lt;std::regex, std::string&gt;&gt;。您可以从中获得更好的缓存性能。
  • @NathanOliver 与订购有什么关系?
  • 正则表达式确实是它们自己的小迷你语言,因此需要对其进行编译。这个编译当然需要一点时间。通过预编译正则表达式而不是在循环中进行,您可以节省大量时间。
  • @PasserBy 如果他们需要对数据进行排序,他们会使用map 而不是unordered_map。由于 OP 使用的是 unordered_map,他们似乎并不关心正则表达式的顺序,如果是这种情况,使用 vector 会做同样的事情,但对缓存更友好。
  • 如果进行分析,我的钱将花在regex_match() 上,所以我和@SomeProgrammerDude 在一起。但是,是的,我也会选择std::vector,除非unordered_map 正在通过例如find() 访问。

标签: c++ regex search unordered-map


【解决方案1】:

std::regex 对象的构造需要大量时间,因为在构造过程中会编译正则表达式输入字符串。因此,请提前构造 std::regex 对象并将它们保存在您选择的容器中。

在预编译的std::regex 对象上调用std::regex_match 非常有效。

考虑在构造 std::regex 对象时也传递 std::regex::optimize 标志。这将意味着更慢的构建速度,但更快的匹配性能。

【讨论】:

  • 谢谢.. 初始化过程花费的时间增加了 300%,但搜索时间减少到了 20%。
  • 有什么办法可以双向搜索
  • 你能解释一下你的意思吗?
  • 我的问题是,我有两个无序映射,map1 和 map2.. Map1 的值中有一个字符串.. Map2 键是 RegEX(已编译),值是结构实例。我必须遍历 Map2 才能找到与 Map1 中的字符串匹配的正则表达式。 Map2 的大小是固定的 2,45,000 Map1 的大小取决于用户.. 在最坏的情况下预计 3000 是唯一的..
  • 你给我描述了一半的yohr解决方案,但你没有解释你要解决的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多