[C ++ Map插入具有重复键的对

问题描述 投票:0回答:1

我正在尝试使用以MAC为密钥的地图。我为MAC和重载运算符

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;
    }
};

我有一些逻辑,可以将数据添加到地图中。确实,即使MAC地址已经在映射中,也会调用插入函数。但是,如果键存在,则地图不必插入,但不存在。具有相同密钥的对具有相同的数据。我该如何解决?

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

enter image description here

c++ stl
1个回答
0
投票

operator<功能不正确。它不会产生严格的弱排序。更改为

bool operator<(const Mac &rhs) const {
    return memcmp(addr, rhs.addr, sizeof(Mac)) < 0; // Use < instead of !=
}
© www.soinside.com 2019 - 2024. All rights reserved.