如何为C ++ map创建自己的字符串比较对象

时间:2018-06-04 15:29:05

标签: c++ string dictionary

我需要一张密钥地图,将'-'视为'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()时会出错。有没有什么好方法可以调试它?

1 个答案:

答案 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”时找到它?