我已经意识到,为了使快速排序起作用,所有的无穷大都需要相等。
换句话说,这样的标准是不够的:
class Entity
{
public:
float value() const;
bool valueIsInfinite() const;
};
class Criterium
{
bool operator()(Entity left, Entity right)const
{
if (left.valueIsInfinite())
return false;
return left.value() < right.value();
}
}
const Criterium criterium;
QVector<Entity> container;
qSort<container.begin(), container .end(), criterium>
这种排序失败,因为根据标准,并非所有无穷大都是相等的。不等式取决于实体进入运算符的顺序。我发现,这样的排序失败了。
我需要这样的东西:
class Criterium
{
bool operator()(Entity left, Entity right)const
{
if (left.valueIsInfinite() && right.valueIsInfinite())
return false;
if (left.valueIsInfinite() && !right.valueIsInfinite())
return false;
if (!left.valueIsInfinite() && right.valueIsInfinite())
return true;
return left.value() < right.value();
}
}
但假设不是
float Entity::value() const;
bool Entity::valueIsInfinite() const;
方法,我只想使用
float Entity::value() const;
让它回来
std::numeric_limits<float>::infinity();
在这种情况下
bool Entity::valueIsInfinite() const;
将返回 true。
现在我测试了这种方法,它似乎有效。但我担心无限可能出现的其他方式。例如:
float otherInfinity = exp(std::numeric_limits<float>::infinity());
这个无限似乎是一样的。但我想确定。我知道 C++ 标准没有提到浮点算术实现的细节,但是如果我使用 gcc,它在所有情况下都安全吗?我的意思是在 gcc 中创建的所有无穷大都是平等的吗?对可能包含在不同场合出现的无穷大的浮动容器进行分类是否安全?