我正在尝试对指向类的智能指针进行排序。我使用结构作为std::sort
与operator()
的第三个参数:
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;
}
};
偶尔,我会遇到一个分段错误,即比较方法中的一个指针指向无效的结构;总是一个。有趣的是,在排序之前,所有对象都是完整的。我还尝试修改该函数以删除参考位:const std::shared_ptr<Phrase> a
,它在其他地方崩溃。
通话没什么花哨的:
std::sort(_detectedPhrases.begin(), _detectedPhrases.end(), PhraseSmartPtrParseCreationComparer());
是否有我想念的东西,或者我应该在别处寻找?
答案 0 :(得分:3)
我不敢相信它能解决多快。这是解释-感谢您的指导和提示@BoBTFish和@Jabberwocky。
实际上,原因是分拣器同时具有两种方式。结果不是对称的。也就是说,相同的两个项目在交换时有时会产生相同的答案。不幸的是,由于业务逻辑,它实际上是有效的。它基本上是一棵树,比较组件之一是是否允许允许作为另一项的父项,并且从理论上讲它们可以成为另一项的父项是有效的。所以我没有改变。我所做的(并希望它不是不好的味道)是添加了这种解决方法(不要紧nullptr
检查,它们是不相关的):
struct PhraseSmartPtrParseCreationComparer
{
bool operator()(const std::shared_ptr<Phrase>& a, const std::shared_ptr<Phrase>& b)
{
return *a < *b && !(*b < *a);
}
};