我正在尝试使用以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;
}
...
operator<
功能不正确。它不会产生严格的弱排序。更改为
bool operator<(const Mac &rhs) const {
return memcmp(addr, rhs.addr, sizeof(Mac)) < 0; // Use < instead of !=
}