带有比较函数的 STL 排序函数中的错误

error in STL sort function with Compare function

我尝试对元素类型为 class 的向量进行排序,如下所示:

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 中的代码并得到 Xcode 错误“线程 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)” 18=]:

我发现代码运行在vector size小于7时正确,而在vector size大于7时报错,很困扰我。 感谢任何回复。

在 Visual Studio 中测试您的代码表明 CompareA_ptr 没有定义 严格的弱排序 作为 comparator 的要求。这会导致未定义的行为。

罪魁祸首似乎是

return x->ranking_score_ >= y->ranking_score_;

其中 >= 应更改为 >

return x->ranking_score_ > y->ranking_score_;