我需要一张密钥地图,将'-'
视为'1'
或'0'
。
例如:
map<string, int>
已有元素<"1-1", 1>
。当我使用map.find("101")
时,我应该<"1-1", 1>
。
这是我的功能
struct keycompare
{
bool operator()(const std::string& x, const std::string& y)
{
int len = x.length();
for(int i=0;i<len;i++){
if(x[i]==y[i])continue;
else if( x[i]=='-' || y[i]=='-')continue;
else return x[i]<y[i];
}
return false;
}
};
在某些情况下使用map.find()
时会出错。有没有什么好方法可以调试它?
答案 0 :(得分:2)
您无法与std::map
进行此类比较。
Compare
模板成员的要求之一是等价关系!comp(a, b) && !comp(b, a)
的及物性。您的比较不成立,例如在案件中
keycompare comp;
auto equiv = [comp](auto l, auto r) { return !comp(l, r) && !comp(r, l); };
std::string a("111");
std::string b("1-1");
std::string c("101");
std::cout << std::boolalpha << "a == b " << equiv(a, b) << std::endl;
std::cout << std::boolalpha << "b == c " << equiv(b, c) << std::endl;
std::cout << std::boolalpha << "a == c " << equiv(a, c) << std::endl;
具体来说,如果您的地图同时包含“111”和“101”,应该在搜索“1-1”时找到它?