std :: set comparator error:" invalid operator<"

时间:2015-02-14 21:12:50

标签: c++ set comparator

所以我为std :: set创建了一个自定义Comparator。代码如下:

class Identifier
{
    std::string nameID;

public:
    std::string NameID() const
    {
        return this->nameID;
    }
};

class IdentifierSorter
{
    static bool icompare_pred(unsigned char a, unsigned char b)
    {
        return std::tolower(a) == std::tolower(b);
    }

    bool icompare(const std::string& a, const std::string& b)
    {
        return std::lexicographical_compare(a.begin(), a.end(),
            b.begin(), b.end(), icompare_pred);
    }

    bool operator()(const Identifier& id1, const Identifier& id2)
    {
        std::string id1n = id1.NameID();
        std::string id2n = id2.NameID();
        return icompare(id1n, id2n);
    }
};

....

std::set<Identifier, IdentifierSorter> Identifiers;

一切正常,直到我尝试这样做:

auto it = Identifiers.find(someIdentifier);

我收到一个运行时错误,内容如下:

Program: C:\Windows\system32\MSVCP120D.dll
File: c:\program files (x86)\microsoft visual studio   12.0\vc\include\xutility
Line: 2941

Expression: invalid operator<

我不确定是什么问题。我是否错误地实施了比较器?

2 个答案:

答案 0 :(得分:2)

谓词的方法必须是公开的:

class IdentifierSorter
{
    public:

    static bool icompare_pred(unsigned char a, unsigned char b)
    {
        return std::tolower(a) == std::tolower(b);
    }

    bool icompare(const std::string& a, const std::string& b)
    {
        return std::lexicographical_compare(a.begin(), a.end(),
            b.begin(), b.end(), icompare_pred);
    }

    bool operator()(const Identifier& id1, const Identifier& id2)
    {
        std::string id1n = id1.NameID();
        std::string id2n = id2.NameID();
        return icompare(id1n, id2n);
    }
};

除了谓词应该表现得像std :: less,而不是

static bool icompare_pred(unsigned char a, unsigned char b)
{
    return std::tolower(a) == std::tolower(b);
}

你想要

static bool icompare_pred(unsigned char a, unsigned char b)
{
    return std::tolower(a) < std::tolower(b);
                       // ^^^
}

答案 1 :(得分:2)

您的代码不起作用,因为您的比较提供了相等的东西,而算法(lexicographical_compare)需要关系。

return std::tolower(a) < std::tolower(b);

BTW:查看错误消息的来源。它应该告诉你谓词无效。在网上搜索“严格弱排序”,这应该会给你进一步的提示,告诉你如何以及为什么这样做。