比较复杂的结构

时间:2017-07-27 04:50:54

标签: c++ vector comparison structure

在过去的2个小时里,我一直在敲打这个,看着SO和google寻求解决方案。我尝试实现了运算符==和嵌套的lambda。

这是struct(多个嵌套结构):

struct Deepest{
    int att1;
    int att2;
};  

struct Useless{
    int u1;
    int u2;
};

struct Leveli {
    std::vector<Deepest> deeps;
    Useless extra;
};

struct Top{
    std::vector<Leveli> multilev;
    int cost;
};

某些int属性实际上是枚举,但它对问题不重要。 所以基本上,我有一个Top对象填充,并且一旦填充,我想识别并消除任何重复的Leveli,仅基于Deepest的向量(我不想比较无用的额外)。以下是我试图开展工作的代码:

    auto sub_comp = [](const Deepest& lhs, const Deepest& rhs) {return (lhs.att1== rhs.att1&& lhs.att2== rhs.att2); };
    auto comp = [&](const Leveli& lhs, const Leveli& rhs) {return std::equal(lhs.deeps.begin(), lhs.deeps.end(), rhs.deeps.begin(), sub_comp); };
    std::sort(mytop.multilev.begin(), mytop.multilev.end());
    auto last = std::unique(mytop.multilev.begin(), mytop.multilev.end(), comp);
    mytop.multilev.erase(last, mytop.multilev.end());

编译时给我一些关于重载函数的错误或者在用lhs == rhs替换lambda时错过了运算符==

也许这种方式不可能,然后我必须在两个级别的向量上手动循环并执行搜索或查看我的数据结构

提前致谢!

最终解决方案:

struct Deepest{
    int att1;
    int att2;

    bool operator==(const Deepest& rhs) {
        return att1 == rhs.att1 && att2 == rhs.att2;
    }

    bool operator<(const Deepest& rhs) {
        return att1 < rhs.att1;
    }
};

struct Useless{
    int u1;
    int u2;
};

struct Leveli {
    std::vector<Deepest> deeps;
    Useless extra;    

    bool operator==(const Leveli& rhs) {
        return std::equal(deeps.begin(), deeps.end(), rhs.deeps.begin());       
    }    

    bool operator<(const Leveli& rhs) {
        return deeps.size() < rhs.deeps.size();
    }
};


struct Top{
    std::vector<Leveli> multilev;
};

测试:

std::sort(strategy.rules.begin(), strategy.rules.end());
auto last = std::unique(strategy.rules.begin(), strategy.rules.end());
strategy.rules.erase(last, strategy.rules.end());

警告!!: 在向多媒体向量中推回Leveli对象之前,应该对向量深度(std :: vector)进行排序(std :: sort)。

1 个答案:

答案 0 :(得分:1)

我能够成功地测试所有这些,它应该足以使你的程序正常工作

$('.navbar-nav>li').on("click", function(event) {
    //debugger;

    if (windowWidth < 992) {
        $(this).find('ul.ul-reset').slideToggle();
        event.stopPropagation();
        console.log('PARENT', event);
    }
});