【问题标题】:error in STL sort function with Compare function带有比较功能的 STL 排序功能出错
【发布时间】:2021-04-09 11:09:42
【问题描述】:

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

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 错误“线程 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)”:

发现向量大小小于7时代码运行正确,向量大小大于7时报错,困扰我不少。 感谢您的任何回复。

【问题讨论】:

  • 您遇到的错误是什么?

标签: c++ sorting stl


【解决方案1】:

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

罪魁祸首似乎是

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

其中&gt;= 应更改为&gt;

return x->ranking_score_ > y->ranking_score_;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多