3

要素を中に入れるたびに並べ替える必要のあるベクトルvecがあります

したがって、最初のアップグレード*をベクター内に配置しても問題はありません。

しかし、2番目のUpgrade *をその中に入れて、sortルーチンが呼び出されると、ランタイムエラーが発生します

これは、要素を配置し、挿入するたびにsortを呼び出す方法です。

std::vector<Upgrade*> stack = getStack();

stack.push_back(element);

std::sort(stack.begin(), stack.end(), CostBenefitUpgradeOrder());

これが私のコンパレータです

struct CostBenefitUpgradeOrder {
    bool operator ()(const Upgrade * u1, const Upgrade * u2) const {

        const UpgradeType upgradeType1 = u1->getUpgradeType();
        const UpgradeType upgradeType2 = u2->getUpgradeType();

        int price1 = PriceUtil::getPrice(upgradeType1);
        int price2 = PriceUtil::getPrice(upgradeType2);

        if (price2 < price1)
            return true;
        else
            return false;
    }
}

これがエラーです

ランタイムエラー

プログラムをデバッグモードで実行した場合にのみ発生することに気づきました。

4

2 に答える 2

7

比較機能が壊れています。trueとの両方u1 < u2を返す述語を持つことはできませんu2 < u1

return u1 < u2;簡単なテストのために何かが必要な場合は、returnステートメントをに置き換えます。

また、本当に使用する必要がありますvectorか?ポインタを連続したメモリに格納する必要がない限り、std::set代わりに適切なコンパレータを使用することをお勧めします。はset、挿入/削除のたびに要素の順序を保持します。

また、生のポインタを使用しているため、を使用してオブジェクトを割り当てる場合は、コンテナから要素を削除newする前に必ず確認してください。deleteさらに良いことに、代わりに使用してstd::set<std::unique_ptr<Upgrade>, CostBenefitUpgradeOrder>、割り当てられたメモリの削除について心配する必要はありません。

于 2012-12-12T01:10:11.533 に答える
5

「厳密な弱順序」(未満)演算子を std::sortメソッドに渡す必要があり、その演算子は「有効」である必要があります。

有効な演算子<には、次のプロパティがあります。

  • すべてバツの場合、バツ< バツ(非反射性)の場合ではありません。すべてのためバツに、
  • yバツ<yの場合、y <x(非対称)ではありません。すべてのために
  • バツ、、、yおよびzバツ<yおよびy<のz場合バツ< z(推移性)。すべてのためバツに、
  • y、、およびzバツがと比較できない場合y、およびyと比較できないz場合はバツ、(比較できzない推移性)と比較できません。

オペレーターが最初のポイント(CostBenefitUpgradeOrder(x, x) == trueあなたの場合は、)で(そして他のほとんどのポイントでも)失敗することがわかります。

于 2012-12-12T01:07:51.190 に答える