我正在尝试使用MAC作为密钥的map。我为MAC和重载operator<编写了用户定义的类,以便在map中使用。
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的对具有相同的数据。我该怎么解决它呢?
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;
}
...

发布于 2020-01-09 12:34:01
operator<函数不正确。它不会产生严格的弱排序。将其更改为
bool operator<(const Mac &rhs) const {
return memcmp(addr, rhs.addr, sizeof(Mac)) < 0; // Use < instead of !=
}我建议进一步完善它,以
bool operator<(const Mac &rhs) const {
return memcmp(addr, rhs.addr, sizeof(addr)) < 0;
}毕竟,您是在将addr与rhs.addr进行比较。
在MacPair中实现的operator<也不正确。您可以使用
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对象之间的!=运算符可以使用<运算符实现。
bool operator!=(const Mac &rhs) const
{
return (*this < rhs) || (rhs < *this);
}https://stackoverflow.com/questions/59657264
复制相似问题