C++ C++;std::映射同一索引的不同键
在进行重构时,我不知怎么搞砸了我的代码,所以我使用的std::map停止正常工作 我正在重新组装碎片化的IPv4数据包。 部分解析的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
数据包
来了,如果它是数据包的片段,它就变成了片段
,具有重新组装的功能
...
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
是无符号字符的别名),您可以定义运算符DoesFragmentCommon
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);
}