问题描述
对于使用自定义等于函数的无序集,比较两个集时该equality definition is ignored。示例:
#include <iostream>
#include <unordered_set>
#include <string>
struct Hash {
size_t operator()(const std::string& str) const {
return 0;
}
};
struct InsensitiveCompare {
bool operator() (const std::string& str1,const std::string& str2) const {
// https://stackoverflow.com/a/43226907/2204581
return str1.size() == str2.size() && std::equal(str1.begin(),str1.end(),str2.begin(),[](auto a,auto b){return std::tolower(a)==std::tolower(b);});
}
};
int main()
{
std::unordered_set<std::string,Hash,InsensitiveCompare> s1,s2;
s1.emplace("test");
s2.emplace("Test");
std::cout << (s1 == s2 ? "" : "not ") << "equal" << std::endl;
// prints "not equal"
return 0;
}
我不明白为什么自定义等式功能没有转发到std::is_permutation
。 operator==
requires比较器在左侧和右侧具有相同的行为,因此可以使用任一比较器。如果您问我,这种情况在最好的情况下是完全出乎意料的,而在最坏的情况下是错的。但是,这不太可能改变。
我的问题是,是否有任何类型的静态代码分析/整理工具可以发现这一点。 -Weverything
和clang-tidy都没有让我知道这一点。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)