我已經意識到,爲了快速排序工作,所有的無窮大必須相等。使用快速排序對可能包含無窮大的容器進行排序是否安全?
換言之,這樣的繞圈是不夠的:
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中創建的所有infinities都是平等的嗎?對可能包含在不同場合出現的無窮大的浮子集裝箱進行分類是否安全?
所有的無窮大是平等的,但有些比其他人更平等。 – Mysticial 2012-07-25 01:54:18