首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STL排序函数与比较函数的误差

STL排序函数与比较函数的误差
EN

Stack Overflow用户
提问于 2021-01-03 11:45:26
回答 1查看 54关注 0票数 0

我尝试对一个向量进行排序,哪一个元素类型是一个类,如下所示:

代码语言:javascript
复制
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时,报告一个错误,这让我很困扰。非常感谢您的回复。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-03 12:32:40

在Visual中测试您的代码时发现,CompareA_ptr没有按照比较器的要求定义严格的弱排序。这会导致不明确的行为。

凶手似乎是

代码语言:javascript
复制
return x->ranking_score_ >= y->ranking_score_;

应该将>=改为>的地方

代码语言:javascript
复制
return x->ranking_score_ > y->ranking_score_;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65549446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档