为什么不计数为集合C ++对象返回正确的值?

时间:2013-08-12 19:47:58

标签: c++

我有一个包含struct数据元素的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

然后在下一次调用此代码时,将检查以下结构值以查看它们是否存在于savedRxDetails中。当我使用下面的值调用“savedRxDetails.count(drugKey)”时,返回的值为“1”:

 alert id   = E51ED799-10C5-475F-9474-1A403B85A83C
 patient_id = 4513004328217
 claim_id   = 114225128231
 ndc_code   = 00006027531

你可以看到struct的第一个元素(alert_id)和第二个元素(patient_id)匹配,但其余的都没有。我是否需要实现除“&lt;”之外的其他运算符和“==”让“计数”方法正常工作?

2 个答案:

答案 0 :(得分:5)

您没有正确实施比较。你应该只比较不同的第一个字段:

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's comparison

可以轻松完成
#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);

答案 1 :(得分:4)

如果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 ... 
 };