我有一个存储指针的容器。我试图根据指针指向的相应对象中的数据成员以非递增顺序对这些指针进行排序。就我而言,许多对象可能具有相同的该数据成员值。
下面是一段简短的代码来说明问题。对排序函数的调用给出了分段错误。奇怪的是,如果容器中有 16 个元素指向具有相同双精度值的对象,则排序似乎有效。但是如果我有 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;
}
您的比较必须实现严格弱序。小于或等于不满足这一点。它应该相当于运算符中实现的“小于”或“大于”<
and >
例如,对于整数。
元素的相等性通过应用此排序两次来确定:
(!cmp(a,b)) && (!cmp(b,a)); // if this is false, a == b
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)