首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++映射插入具有重复键的对

C++映射插入具有重复键的对
EN

Stack Overflow用户
提问于 2020-01-09 12:29:27
回答 1查看 46关注 0票数 0

我正在尝试使用MAC作为密钥的map。我为MAC和重载operator<编写了用户定义的类,以便在map中使用。

代码语言:javascript
运行
复制
class Mac {
public:
    uint8_t addr[6];

    std::string to_string() const {
        char mac_to_string[18];

        sprintf(mac_to_string, "%02X:%02X:%02X:%02X:%02X:%02X", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);

        return std::string(mac_to_string);
    }

    Mac &operator=(const Mac &rhs) {
        memcpy(addr, rhs.addr, sizeof(Mac));

        return *this;
    }

    Mac &operator=(uint8_t rhs[6]) {
        memcpy(addr, rhs, sizeof(Mac));

        return *this;
    }

    bool operator<(const Mac &rhs) const {
        return memcmp(addr, rhs.addr, sizeof(Mac)) != 0;
    }
};

我有一些将数据添加到map中的逻辑。即使MAC地址已经在映射中,也会调用插入函数。但如果key存在但不存在,map就不能插入,具有相同key的对具有相同的数据。我该怎么解决它呢?

代码语言:javascript
运行
复制
class MacPair {
public:
    Mac src_mac;
    Mac dst_mac;

    MacPair() {

    }

    MacPair(uint8_t src_mac[6], uint8_t dst_mac[6]) {
        this->src_mac = src_mac;
        this->dst_mac = dst_mac;
    }

    MacPair &operator=(const MacPair &rhs) {
        src_mac = rhs.src_mac;
        dst_mac = rhs.dst_mac;

        return *this;
    }

    bool operator<(const MacPair &rhs) const {
        return src_mac < rhs.src_mac || dst_mac < rhs.dst_mac;
    }
};

...
if (obj->mac_conversations.find(mac_pair) != obj->mac_conversations.end()) {
    mac_exists = true;
}
else if (obj->mac_conversations.find(rev_mac_pair) != obj->mac_conversations.end()) {
    mac_exists = true;
    mac_is_reverse = true;
}

if (!mac_exists) {
    obj->mac_conversations.insert(make_pair(mac_pair, PacketInfo()));
    obj->mac_endpoints.insert(make_pair(mac_pair.src_mac, PacketInfo()));
    obj->mac_endpoints.insert(make_pair(mac_pair.dst_mac, PacketInfo()));
    mac_exists = true;
}
...

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-09 12:34:01

operator<函数不正确。它不会产生严格的弱排序。将其更改为

代码语言:javascript
运行
复制
bool operator<(const Mac &rhs) const {
    return memcmp(addr, rhs.addr, sizeof(Mac)) < 0; // Use < instead of !=
}

我建议进一步完善它,以

代码语言:javascript
运行
复制
bool operator<(const Mac &rhs) const {
    return memcmp(addr, rhs.addr, sizeof(addr)) < 0;
}

毕竟,您是在将addrrhs.addr进行比较。

MacPair中实现的operator<也不正确。您可以使用

代码语言:javascript
运行
复制
bool operator<(const MacPair &rhs) const {
    if ( src_mac != rhs.src_mac )
    {
       return src_mac < rhs.src_mac;
    }
    return dst_mac < rhs.dst_mac;
}

两个Mac对象之间的!=运算符可以使用<运算符实现。

代码语言:javascript
运行
复制
bool operator!=(const Mac &rhs) const
{
    return (*this < rhs) || (rhs < *this);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59657264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档