c++ - 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
插入了两次,但它不应该按照我的比较器。
解决方案
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
,并且工作正常。
推荐阅读
- javascript - 让用户知道 react 中组件的 props
- javascript - 多行系列中鼠标悬停的问题
- bitbucket - 在 bitbucket 的拉取请求中包含存储库
- perl - 为什么当我们想换班时不应该使用 my ?
- jmeter - 使用 1 个连接和多个并发发布运行 MQTT
- ios - 通过 URL 将令牌传递到 Webview IOS Swift
- angular - 使用 try catch 错误处理不会捕获错误
- salt-stack - 为什么盐导出和命令执行不发生?
- java - Maven 指南中生成的示例 jar 中的资源是如何添加的?
- r - 如何识别数据框中具有相同值的列?