クイックソートが機能するには、すべての無限が等しい必要があることに気付きました。
言い換えれば、そのような基準は十分ではありません。
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 で等しく作成されますか? さまざまな機会に発生した無限を含む可能性のあるフロートのコンテナーをソートしても安全ですか?