Vad*_*man 5 c++ sorting smart-pointers
我正在尝试将智能指针的向量排序到类.我使用结构作为第三个参数来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;
}
};
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)
有什么我想念的东西或者我应该在其他地方寻找吗?
我不敢相信它解决的速度有多快。这是解释 - 感谢您的指导和提示,@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)