一尘不染

std :: sort比较元素为null

algorithm

我有以下排序算法,用于std::vector对唯一armor_set指针进行排序。通过我的排序算法的某些属性,它闷死了起来,跑进这最终比较有效的未定义行为lhsrhs这是一个nullptr

尽管多次移动算法,但我仍然无法识别问题。我觉得好像缺少某种关于该std::sort算法如何工作的简单规则。

任何帮助,将不胜感激。

std::vector<armor_set*> armor_sets;

//insertion of unique armor sets here

std::sort(armor_sets.begin(), armor_sets.end(), [](armor_set* lhs, armor_set* rhs)
{
    auto lhs_collectible_count = collectible_mgr::get().count(lhs->needed_collectible);
    auto rhs_collectible_count = collectible_mgr::get().count(rhs->needed_collectible);

    if(lhs_collectible_count > 0 && rhs_collectible_count == 0)
    {
        return true;
    }
    else if(lhs_collectible_count == rhs_collectible_count)
    {
        return lhs->sort_index > rhs->sort_index;
    }
    else
    {
        auto lhs_collectibles_needed_count = lhs_collectible_count - lhs->collectibles_needed;
        auto rhs_collectibles_needed_count = rhs_collectible_count - rhs->collectibles_needed;

        return lhs_collectibles_needed_count > rhs_collectibles_needed_count;
    }
});

阅读 210

收藏
2020-07-28

共1个答案

一尘不染

比较函数必须遵循严格弱排序。

例如,如果我是sort函数,则给您两个armour_set指针,问您“哪个先出现?”。然后您返回一个真/假值,表示哪个值在前。然后,我给您两个相同的armour_set指针,但是这次更改项目的顺序。我问你同样的问题“哪个先到?”。然后,您返回相同的true
/ false值。猜猜-您输了。

简而言之,这违反了严格的弱排序。没有办法a < b,而且同时b < a。看一下您比较复杂的比较功能,我猜您是在违反此规则。

如果您使用的是Visual
Studio,则调试运行时将对此类排序违规进行准确的检查。比较函数被调用两次,第一次以A,B顺序,第二次以B,A顺序。比较每个调用的返回值,如果存在冲突,则将发生assert()。

2020-07-28