![](/img/trans.png)
[英]Creating a CTime @ 2am doesn't return the correct value (Windows CE, C++)
[英]Why doesn't count return the correct value for a set C++ object?
我有一个包含结构数据元素的set对象。 但是,当对象未包含在set对象中时,count似乎返回“ 1”。 似乎只看该结构的第一个元素。 我究竟做错了什么? 这是我的代码示例:
我也实现了“ <”和“ ==”运算符:
struct drugKey_tp { std::string alert_uuid;
std::string patient_id;
std::string claim_id;
std::string ndc_code;
};
inline bool operator<(const drugKey_tp &lhs,
const drugKey_tp &rhs) {
return (lhs.alert_uuid < rhs.alert_uuid &&
lhs.ndc_code < rhs.ndc_code &&
lhs.claim_id < rhs.claim_id &&
lhs.ndc_code < rhs.ndc_code);
};
inline bool operator==(const drugKey_tp &lhs, const drugKey_tp &rhs) {
return (lhs.alert_uuid == rhs.alert_uuid &&
lhs.patient_id == rhs.patient_id &&
lhs.claim_id == rhs.claim_id &&
lhs.ndc_code == rhs.ndc_code);
};
在这里,我检查对象是否存在,如果不存在,则添加它们:
drugKey_tp drugKey;
static set<drugKey_tp> savedRxDetails;
...
drugKey.alert_uuid = <some value>;
drugKey.patient_id = <some value>;
drugKey.claim_id = <some value>;
drugKey.ndc_code = <some value>;
if (savedRxDetails.count(drugKey) == 0) {
// Save the detail if this detail has not been saved
savedRxDetails.insert(drugKey);
}
else {
return;
}
我在“ savedRxDetails”中添加了以下四个值:
alert id = E51ED799-10C5-475F-9474-1A403B85A83C
patient_id = 4513004328217
claim_id = 126872102351
ndc_code = 55111059430
然后在下一次调用此代码时,将检查以下结构值以查看它们是否存在于saveRxDetails中。 当我使用以下值调用“ savedRxDetails.count(drugKey)”时,返回的值为“ 1”:
alert id = E51ED799-10C5-475F-9474-1A403B85A83C
patient_id = 4513004328217
claim_id = 114225128231
ndc_code = 00006027531
您可以看到该结构匹配的第一个元素(alert_id)和第二个元素(Patient_id),但其余所有元素均不匹配。 我是否需要实现除“ <”和“ ==”之外的其他运算符,才能使“ count”方法正常工作?
您没有正确实现比较。 您应该只比较前几个不同的字段:
if (lhs.alert_uuid != rhs.alert_uuid)
return lhs.alert_uuid < rhs.alert_uuid;
else if (lhs.ndc_code != rhs.ndc_code)
return lhs.ndc_code < rhs.ndc_code;
else if ( /* etc ... */ )
使用std::tuple
的比较更容易做到这一点:
#include <tuple>
return
std::tie(lhs.alert_uuid, lhs.ndc_code, lhs.claim_id, lhs.patient_id) <
std::tie(rhs.alert_uuid, rhs.ndc_code, rhs.claim_id, rhs.patient_id);
如果lhs.alert_uuid == rhs.alert_uuid
,这将返回false,我怀疑这是错误的。
inline bool operator<(const drugKey_tp &lhs,
const drugKey_tp &rhs) {
return (lhs.alert_uuid < rhs.alert_uuid &&
lhs.ndc_code < rhs.ndc_code &&
lhs.claim_id < rhs.claim_id &&
lhs.ndc_code < rhs.ndc_code);
};
我怀疑您想要的是:
inline bool operator<(const drugKey_tp &lhs,
const drugKey_tp &rhs) {
if (lhs.alert_uuid != rhs.alert_uuid)
{
return lhs.alert_uuid < rhs.aler_uuid;
}
if (lhs.ndc_code != rhs.ndc_code)
{
return lhs.ndc_code < rhs.ndc_code;
}
... and so on ...
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.