智能指针排序矢量:神秘崩溃

Vad*_*man 5 c++ sorting smart-pointers

我正在尝试将智能指针的向量排序到类.我使用结构作为第三个参数来std::sortoperator():

struct PhraseSmartPtrParseCreationComparer
{
    bool operator()(const std::shared_ptr<Phrase>& a, const std::shared_ptr<Phrase>& b)
    {
        if (a.get() == nullptr)
            return b.get() != nullptr;
        if (b.get() == nullptr)
            return a.get() != nullptr;
        return *a < *b;
    }
};
Run Code Online (Sandbox Code Playgroud)

偶尔,我得到一个分段错误,其中比较方法中的一个指针指向无效的结构; 总是一个.有趣的是,在排序之前,所有对象都是完整的; 我也尝试修改函数来删除引用位:const std::shared_ptr<Phrase> a,并在其他地方崩溃.

电话没什么特别的:

std::sort(_detectedPhrases.begin(), _detectedPhrases.end(), PhraseSmartPtrParseCreationComparer()); 
Run Code Online (Sandbox Code Playgroud)

有什么我想念的东西或者我应该在其他地方寻找吗?

Vad*_*man 4

我不敢相信它解决的速度有多快。这是解释 - 感谢您的指导和提示,@BoBTFish 和 @Jabberwocky。

事实上,原因是分拣机是双向的。结果不对称。也就是说,相同的两个项目在交换时有时会产生相同的答案。不幸的是,由于业务逻辑,它实际上是有效的。它基本上是一棵树,比较的一个组成部分是是否允许一个项目成为另一个项目的父项——理论上两者都可以成为另一个项目的父项的情况是有效的。所以我没有改变这一点。我所做的(希望这不是坏品味)是添加这个解决方法(不用介意检查nullptr,它们不相关):

struct PhraseSmartPtrParseCreationComparer
{
    bool operator()(const std::shared_ptr<Phrase>& a, const std::shared_ptr<Phrase>& b)
    {
       return *a < *b && !(*b < *a);    
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 是的,所以你的 `Phrase` 的 `operator&lt;` 不满足任何人对 C++ 中小于运算符的通常要求。解决这个问题,而不是在顶部分层解决方法。 (4认同)
  • 如果没有反向检查,这会/不应该起作用吗?因为这似乎意味着您的“Phrase”的“operator&lt;”不满足通常的要求 (2认同)