首页 > 解决方案 > std::set 比较器

问题描述

我正在std::set使用自定义比较器进行测试。但我看到同一个对象被插入两次。

以下是对象类:

 class Info
    {
        public:
            Info(string n, string oN, int dom):
                    name(n),
                    objName(oN),
                    domain(dom)
            {}
    

        void setName(std::string n) { name = n;}
        void setObjName(std::string n) { objName = n;}
        void setDomain(int dom) { domain = dom; }

        std::string getName() const { return name;}
        std::string getObjName() const { return objName;}
        int getDomain() const { return domain;}

    private:
        std::string name;
        std::string objName;
        int domain;
};

以下是我的自定义比较器:

struct InfoCmp {
bool operator() (const Info &lhs, const Info &rhs) const {
    if((lhs.getName() < rhs.getName()) || (lhs.getObjName() < rhs.getObjName()) || (lhs.getDomain() < rhs.getDomain()) ){
        return true;
        }
    return false;
    }
};

以下是用法:

Info rst1("rst1", "rstObj1", 1);
Info rst2("rst2", "rstObj2", 2);
Info rst3("rst1", "rstObj3", 3);

std::set<Info,InfoCmp> resetSet;

resetSet.insert(rst1);
resetSet.insert(rst2);
resetSet.insert(rst3);
resetSet.insert(rst1);
resetSet.insert(rst2);
resetSet.insert(rst3);

我看到rst2插入了两次,但它不应该按照我的比较器。

标签: c++set

解决方案


struct InfoCmp2 {
    bool operator() (const Info &lhs, const Info &rhs) const {
        return std::make_tuple(lhs.getName(), lhs.getObjName(), lhs.getDomain()) < std::make_tuple(rhs.getName(), rhs.getObjName(), rhs.getDomain());
    }
};

该运算符也可以编写make_tuple,并且工作正常。


推荐阅读