C++ C++;std::映射同一索引的不同键

C++ C++;std::映射同一索引的不同键,c++,dictionary,C++,Dictionary,在进行重构时,我不知怎么搞砸了我的代码,所以我使用的std::map停止正常工作 我正在重新组装碎片化的IPv4数据包。 部分解析的数据包来了,如果它是数据包的片段,它就变成了片段,具有重新组装的功能 ... if(packet.isIPv4() && packet.isFragment()){ auto keyForMap = packet.key(); auto it = fragments.find(keyForMap); auto frag

在进行重构时,我不知怎么搞砸了我的代码,所以我使用的std::map停止正常工作

我正在重新组装碎片化的IPv4数据包。 部分解析的
数据包
来了,如果它是数据包的片段,它就变成了
片段
,具有重新组装的功能

...    
if(packet.isIPv4() && packet.isFragment()){
    auto keyForMap = packet.key();
    auto it = fragments.find(keyForMap);
    auto fragmentNotFound = fragments.end();

    std::cout << "-----------------------"  << std::endl;        
    std::cout << "Fragments len: " << fragments.size() << std::endl;        

    keyForMap.print();

    if(it == fragmentNotFound){
        std::cout << "Not Found" << std::endl;
        fragments[keyForMap] = Fragment(packet);
    } else {
        std::cout << "Found" << std::endl;

        fragments[keyForMap].add(packet);
        /* reassembling function call and some processing */
        }
    }
}
...
这是我的代码给我的输出:

-----------------------
Fragments len: 0 // Correct (this is first fragment so nothing is in map)
key>192.168.1.3 192.168.1.4 6 1
Not Found // So it's added into map
-----------------------
Fragments len: 1 // Correct (1st fragment is in map)
key>192.168.1.5 192.168.1.6 6 1
Found // Not correct...keys are different
-----------------------
Fragments len: 1
key>192.168.1.5 192.168.1.6 6 1
Found
-----------------------
Fragments len: 1
key>192.168.1.5 192.168.1.6 6 1
Found
-----------------------

考虑到您在问题中发布和陈述的内容,由于
IPv4
std::array
(我假设
uchar\t
unsigned char
的别名),您可以根据您在问题中发布和陈述的内容定义
operator,因为
IPv4
std::array
(我假设
uchar\t
无符号字符的别名),您可以定义
运算符Does
FragmentCommon
have operator
@无用是的,它有
静态布尔运算符请编辑您的问题以添加关键信息。因此,根据该定义,
运算符应该包含在问题中的是什么,因为它是该类型的公共接口的一部分。有趣的是Action通常是错误的(它应该比较所有成员),但应该在您的示例中起作用。但是,由于您没有显示实际的代码:当声明映射时,该运算符是否可见?它是否与
FragmentCommon
位于同一命名空间中,并且肯定正在使用?当您单独测试它时,它是否达到了预期效果?@SamoPoláček--您发布了诸如
print之类的无关函数()
,但您遗漏了
运算符是否
片段公共
是否有运算符
@无用是的,它有
静态布尔运算符请编辑您的问题以添加关键信息。因此,根据该定义,
运算符应该包含在问题中,因为它是该类型的公共接口的一部分.该函数通常是错误的(它应该比较所有成员),但应该在您的示例中起作用。但是,由于您没有显示实际的代码:当声明映射时,该运算符是否可见?它是否与
FragmentCommon
位于同一命名空间中,并且肯定正在使用?当您单独测试它时,它是否达到了预期效果?@SamoPoláček--您发布了诸如
print之类的无关函数()
,但您遗漏了
运算符
-----------------------
Fragments len: 0 // Correct (this is first fragment so nothing is in map)
key>192.168.1.3 192.168.1.4 6 1
Not Found // So it's added into map
-----------------------
Fragments len: 1 // Correct (1st fragment is in map)
key>192.168.1.5 192.168.1.6 6 1
Found // Not correct...keys are different
-----------------------
Fragments len: 1
key>192.168.1.5 192.168.1.6 6 1
Found
-----------------------
Fragments len: 1
key>192.168.1.5 192.168.1.6 6 1
Found
-----------------------
#include <tuple>
//...
static bool operator < (const struct FragmentCommon &lhs, const struct FragmentCommon &rhs)
{
    return std::tie(lhs.ip_dst, lhs.ip_src, lhs.protocol, lhs.identification) < 
           std::tie(rhs.ip_dst, rhs.ip_src, rhs.protocol, rhs.identification);
}