C++ 为什么';t count返回集合C+的正确值+;对象

C++ 为什么';t count返回集合C+的正确值+;对象,c++,C++,我有一个包含struct数据元素的set对象。但是,当对象不包含在set对象中时,count似乎返回“1”。看起来它只是在查看结构的第一个元素。我做错了什么?下面是我的代码示例: 我确实实现了“如果lhs.alert\u uuid==rhs.alert\u uuid,这将返回false,我怀疑这是错误的 inline bool operator<(const drugKey_tp &lhs, const drugKey_tp &

我有一个包含struct数据元素的set对象。但是,当对象不包含在set对象中时,count似乎返回“1”。看起来它只是在查看结构的第一个元素。我做错了什么?下面是我的代码示例:


我确实实现了“如果
lhs.alert\u uuid==rhs.alert\u 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操作符如果
lhs.alert\u uuid==rhs.alert\u 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);
 };

内联布尔运算符您没有正确实现比较。您应该只比较第一个不同的字段:

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 ... */ )

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

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 ... */ )

您的比较器不正确。将
a
b
与您的定义同时使用是可行的。这打破了要求严格弱排序的
std::set
确定性算法。您在问题最后提出的建议是解决此问题的一种方法(还有一些严格使用
运算符的人您的比较器不正确。将
a
b
与您的定义同时使用是可行的。这打破了要求严格弱排序的
std::set
确定性算法。您在问题末尾的建议是解决问题的一种方法这(还有其他严格使用
运算符的
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 ... 
 };
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 ... */ )
#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);