C ++ std :: map不同的键寻址相同的索引

时间:2017-10-28 22:45:00

标签: c++ dictionary

虽然在进行重构时,我已经以某种方式搞砸了我的代码,因此我使用的std :: map停止了正常工作。

我正在重新组装碎片化的IPv4数据包。 部分解析ValueError: Series lengths must match to compare 来了,如果它的数据包片段变成Packet,它具有重组的功能。

Fragment

使用的数据类型: ... 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 */ } } } ... IPv4

std::array<uchar_t, 4>fragments

fragments_t &fragments_t

std::map<FragmentCommon, Fragment>

这是我的代码给我的输出:

struct FragmentCommon{
    FragmentCommon(IPv4 ipsrc,
                   IPv4 ipdst,
                   uchar_t protocol,
                   uint16_t identification) : ip_src(ipsrc),
                                              ip_dst(ipdst),
                                              protocol(protocol),
                                              identification(identification){};

    void print(){
        printf("key>%d.%d.%d.%d ", ip_src[0], ip_src[1], ip_src[2], ip_src[3]);
        printf("%d.%d.%d.%d ", ip_dst[0], ip_dst[1], ip_dst[2], ip_dst[3]);
        printf("%d %d\n", protocol, identification);
    };

    IPv4 ip_src;
    IPv4 ip_dst;
    uchar_t protocol;
    uint16_t identification;
};

static bool operator<(const struct FragmentCommon &lhs, const struct FragmentCommon &rhs){
    return lhs.ip_dst         < rhs.ip_dst &&
           lhs.ip_src         < rhs.ip_src &&
           lhs.protocol       < rhs.protocol &&
           lhs.identification < rhs.identification;
}

1 个答案:

答案 0 :(得分:2)

鉴于您发布并在问题中说明的内容,因为IPv4std::array<uchar_t,4>(我假设uchar_tunsigned char的别名),您可以使用std::tieoperator <定义FragmentCommon

在处理多个值以进行测试时,使用std::tie更容易定义严格弱排序std::map键所需)更容易出错“层叠”的时尚。

#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);
}

自定义std::array has operator <以来,在std::tie中使用所有4个参数时,使用std::tie正常工作。