我尝试对一个向量进行排序,哪一个元素类型是一个类,如下所示:
void sort_test() {
class A{
public:
A(float x, float y, float z):score_(x),rerank_score_(y),ranking_score_(z) {};
float score_;
float rerank_score_;
float ranking_score_;
};
using A_ptr = std::shared_ptr<A>;
auto CompareA_ptr = [](A_ptr x, A_ptr y) {
if (x == nullptr && y != nullptr) {
return false;
} else if (x == nullptr && y == nullptr) {
return false;
} else if (x != nullptr && y == nullptr) {
return true;
} else {
if (x->rerank_score_ > y->rerank_score_) {
return true;
} else if (x->rerank_score_ < y->rerank_score_) {
return false;
} else {
if (x->score_ > y->score_) {
return true;
} else if (x->score_ < y->score_) {
return false;
} else {
return x->ranking_score_ >= y->ranking_score_;
}
}
}
};
std::vector<A_ptr> X;
for (int i = 0; i < 7; ++i) {
X.push_back(std::make_shared<A>(A(0.1, 0.1, 0.1)));
}
std::sort(X.begin(), X.end(), CompareA_ptr);
}
int main(){
sort_test();
return 0;
}我在Xcode中运行代码并获得memory.cpp中的Xcode错误"Thread 1: code=EXC_I386_GPFLT“:

我发现,当向量小于7时,代码运行正常;当向量大小大于7时,报告一个错误,这让我很困扰。非常感谢您的回复。
发布于 2021-01-03 12:32:40
在Visual中测试您的代码时发现,CompareA_ptr没有按照比较器的要求定义严格的弱排序。这会导致不明确的行为。
凶手似乎是
return x->ranking_score_ >= y->ranking_score_;应该将>=改为>的地方
return x->ranking_score_ > y->ranking_score_;https://stackoverflow.com/questions/65549446
复制相似问题