【问题标题】:How can I hash a std::regex?如何散列 std::regex?
【发布时间】:2017-01-29 18:49:41
【问题描述】:

我需要散列一个具有std::regex 作为成员的类,该成员是从类的构造函数中的字符串初始化的。

为了获得类的良好哈希,我可以将模式字符串的哈希存储在构造函数中,或者——首选方式——计算正则表达式本身的哈希。这可能吗(最好没有提升)?

更准确地说:我想计算

std::hash<std::regex>{}(m_regex);

其中 m_regex 的类型为 std::regex,但不存在 std::regex 的模板特化。

非常感谢您的帮助。

【问题讨论】:

  • en.cppreference.com/w/cpp/language/extending_std 你可以扩展stdstd::hash 添加你自己的专业化。
  • @GillBates:但是您可以为标准库中的类型执行此操作吗? std::regex 不是用户定义的类型(以任何方式),所以我不确定是否专门针对 std::hash 将其视为明确定义或未定义的行为。
  • 如果您无法检查相等性以排除哈希冲突,那么哈希是无用的,并且std::regex 没有提供任何您可以使用的operator==
  • 顺便说一句,std::regex 不提供==-operator 是否有原因?我想不出为什么正则表达式不应该具有可比性......
  • @jafasi 两个正则表达式何时比较相等?当它们由相同的字符串构造时,当它们由相同的内部表示组成时,或者当它们匹配相同的输入时?第一个需要以对大多数程序无用的方式存储字符串。第二种意味着实现将无法就哪些正则表达式应该和不应该比较相等达成一致。第三个很难实现,比让基本的正则表达式功能正常工作要困难得多。

标签: c++ regex c++11 hash stl


【解决方案1】:

不能散列std::regex 对象,因为它被假定为具有internal representation(可能不可移植)。请记住 std::regex 对象带有一些 other information。如果您正在考虑使用用于构造对象(或分配)的正则表达式模式字符串,您仍然不能,因为您无法检索用于构造std::regex 对象的字符串,因为it isn't required 来存储字符串。


一种可能的解决方法是保存用于构造std::regex 对象的字符串和flags,然后在需要时构造一个正则表达式对象。

【讨论】:

  • 是的,这就是我在问题中的意思以及我目前正在做的事情:在构造时保存(字符串的)哈希。我只是想知道是否有更好的方法。
  • @jafasi。不,我不知道有其他方法。我认为std::regex 是某种资源。
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
相关资源
最近更新 更多