1

Visual Studio 2010でコードに問題が発生していますが、DevCPPでは問題が発生していません。これが状況です。コードでC++STLを使用setして挿入しましたが、キーの代わりに値を使用して並べ替えpair<string, double>たいので、カスタムコンパレータを使用してこれを実現しました。set

struct sortPairSecond
{
   bool operator()(const pair<string, double> &lhs, const pair<string, double> &rhs)
   {
    return lhs.second >= rhs.second;
   }
};

コードはDevCPPで正常に機能しますが、VS2010を使用してxtreeでデバッグアサーションが失敗しました。デバッグを行ったところ、カスタムコンパレータで> =を使用したためにエラーが発生し、=を削除してコードを機能させることができましたが、プログラムで重複値を許可する必要があるため、誤った結果が発生しました。したがって、誰でもこの問題について私を助けることができますか?

4

1 に答える 1

8

厳密な順序である必要があり、両方を真にすることはできないため、使用することと使用>=しない>ことは無効になる可能性があります(ただし、それらが等しい場合はそうなります)。op(a,b)op(b,a)

これは単なるアサーションエラーですが、set重複する値を含めることはできません。ソートされたものを使用するvectorか、使用できますmultiset(そして'>'を使用します)

もちろん、最初の値が一意であることがわかっているので、2番目の値が最初の値と比較するのと等しい場合に述語を拡張できます。それはあなたにユニークな値を保証します、そしてあなたはまだ使うことができますstd::set

struct sortPairSecond
{
   bool operator()(const pair<string, double> &lhs, const pair<string, double> &rhs) const
   {
    return (lhs.second > rhs.second) || (lhs.second == rhs.second && lhs.first > rhs.first) ;
   }
};

std::set基本的に、述語を操作しようとして、使用目的を「壊そう」としないでください。

于 2012-11-14T09:28:12.220 に答える