使用带有结构的地图作为键 - 值不会保存[重复]

Posted

技术标签:

【中文标题】使用带有结构的地图作为键 - 值不会保存[重复]【英文标题】:Using map with structure as key - value doesn't save [duplicate] 【发布时间】:2014-04-06 08:33:16 【问题描述】:

我对 c++ std::map 容器和结构作为键没有什么问题。

我想使用 map 作为 ipv6 查找表的快速查找表。我有带有 IP 地址的文件,我想汇总它们。

我的地图键是

struct myipv6
uint64_t MSB;
uint64_t LSB;

bool operator==(const myipv6 &a)
            return (MSB == a.MSB && LSB == a.LSB);


bool operator<(const myipv6 &a)
                return (MSB < a.MSB && LSB < a.LSB);

myipv6()
myipv6(const uint64_t A,const uint64_t B) :
    MSB(A),LSB(B) 
;

bool operator < (const myipv6 &l, const myipv6 &r)  return ( l.MSB < r.MSB && l.LSB < r.LSB); 

数据是从 in6_addr 插入的

memcpy(&(ip), &src_addr, sizeof(myipv6));

这项建设工作,我尝试将数据复制到 ip。从 ip 使用 memcpy 到另一个 in6_addr 并使用 inet_pton 检查值是否正确。

地图被声明为

map<myipv6, int> aggregate;
map<myipv6, int>::iterator it;

当我遍历文件中的所有 IP 地址并将其用于聚合时:

    it = aggregate.find(ip);
    if(!(ip == it->second.ip))
            aggregate[ip] = 1;
    else
            it->second += 1;
    

我得到了不好的结果,记录丢失了......当我使用它 == aggregate.end() 而不是 !(ip == it->second.ip) 作为 else 语句中的条件时,我明白了它->首先不等于ip。 但是当我使用 !(ip == it->second.ip) 迭代器有任何值时,当我写“新”项目来映射时,我会重写保存的数据。

对于这种奇怪的行为有什么想法吗?

最后一个问题,是否可以使用 unordered_map 代替 map ?

谢谢

【问题讨论】:

【参考方案1】:

你应该使用:

bool operator < (const myipv6 &l, const myipv6 &r) 
    return (l.MSB < r.MSB) || (l.MSB == r.MSB && l.LSB < r.LSB);

这叫lexicographical order。

整个班级可能是这样的:

struct myipv6 
    uint64_t MSB;
    uint64_t LSB;

    friend bool operator==(const myipv6 &a, const myipv6 &b) 
            return (a.MSB == b.MSB && a.LSB == b.LSB);
    

    friend bool operator<(const myipv6 &a, const myipv6 &b) 
                return (a.MSB < b.MSB) || (a.MSB == b.MSB && a.LSB < b.LSB);
    

    myipv6() 

    myipv6(const uint64_t A,const uint64_t B) : MSB(A),LSB(B) 
;

使用friend 是define theses comparison operators 的一种优雅方式。

【讨论】:

谢谢! :) 工作 @TomasLysek 在 C++11 中,有一种使用 std::tie 实现比较运算符的简单方法。一旦你有两个以上的数据成员手工操作就会变得很痛苦并且容易出错。 @TomasLysek 那个不错

以上是关于使用带有结构的地图作为键 - 值不会保存[重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有键的 std::map 作为具有三个 int 成员的结构 [重复]

使用std shared_ptr作为std :: map键

如何在带有向量作为值类型的地图中添加值?

C ++在集合/映射中使用Vector作为键不会导致唯一的答案

Redis 整数集合

我正在尝试创建一个带有位置键的地图,其中包含一个双精度列表作为坐标,但我收到一个错误