c++ - std::sort with equal elements 给出段错误

标签 c++ sorting segmentation-fault

我有一个存储指针的容器。我正在尝试根据指针指向的相应对象中的数据成员以非递增顺序对这些指针进行排序。在我的例子中,许多对象可能对该数据成员具有相同的值。

下面是一个简短的代码来说明这个问题。对排序函数的调用给出了段错误。奇怪的是,如果我在容器中有 16 个元素指向具有相同 double 值的对象,则排序似乎有效。但是,如果我有 17 个元素指向具有相同值的对象,则会出现段错误。

谁能解释一下为什么会这样?

#include <iostream>
#include <algorithm>
#include <deque>

//some class
class A {
public:
    double a;
    A(double aval);
};

A::A(double aval) : a(aval) {}

//compare class
struct cmp_A : std::greater_equal<A*> {
    bool operator() (const A* x, const A* y) const;
} cmp_A_obj;

//greater_equal comparison
bool cmp_A::operator() (const A* x, const A* y) const {
    return (x->a >= y->a);
}

int main() {
    std::deque<A*> Adeque;
    //insert 17 A pointers into the container
    for(int i = 1; i<=17; i++) {
        Adeque.push_back(new A(5));
    }

    //This call to sort gives a Segmentation fault
    std::sort(Adeque.begin(), Adeque.end(), cmp_A_obj);

    for(std::deque<A*>::iterator i = Adeque.begin(); i!= Adeque.end(); i++) {
        std::cout << "|" << (*i)->a;
    }
    std::cout << std::endl;
}

最佳答案

您的比较必须实现 strict weak ordering .小于或等于不满足这一点。它应该相当于运算符中实现的“小于”或“大于”<>例如,整数。

元素的相等性通过两次应用此排序来确定:

(!cmp(a,b)) && (!cmp(b,a)); // if this is false, a == b

关于c++ - std::sort with equal elements 给出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16535882/

相关文章:

c++ - 如何为初学者开发 WebRTC 应用程序?

c++ - C++中二维数组的内存分配

c++ - 扩展 ASCII 字符的十进制值

algorithm - 什么时候大 O 或 Omega 或 theta 可以成为集合的元素?

c++ - 如何创建一个函数,仅通过更改链接来交换单向链表中的两个相邻元素?

c++ - 如何估计库函数的使用情况

perl - 如何在 Perl 中对文本文件中的行进行排序?

c - 在 C 中对递增列表进行排序

C编程总线错误/段错误

c - 段错误(核心已转储)