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