2015-09-16 9 views
5

pair<int,int>の演算よりもオーバーロードされているため、特定の方法でベクトルをソートできます。私はそれがペアの最初のキーに従って昇順になるようにし、最初のキーが等しい場合は、2番目のキーに従って降順にしたいと思います。オーバーロードされた演算子<on pairがソートで使用されていません

並べ替え機能がオーバーロードされた<演算子を使用していないようですが、<が2つのペアで呼び出された場合、返される出力は期待通りです。私はテストのために使用していた下のコードのスニペットを添付した:

#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 
bool operator<(pair<int, int> &a, pair<int, int> &b) 
{ 
    if (a.first < b.first) return true; 
    else if ((a.first == b.first) && (a.second > b.second)) return true; 
    return false; 
} 

int main() { 
    vector<pair<int, int>> test {make_pair(1,10), make_pair(3,4), make_pair(3,8), make_pair(6, 23), make_pair(1,6)}; 
    sort(test.begin(), test.end()); 
    for (int i = 0; i < test.size(); i++) 
     cout << test[i].first << " - " << test[i].second << " "; 
    cout << endl; 
    auto a = make_pair(3,4); 
    auto b = make_pair(3,8); 
    cout << (a < b) << endl; 
    return 0; 
} 

入力ベクトルが{(1,10), (3,4), (3,8), (6,23), (1,6)}あります。

私は出力が{(1,10), (1,6), (3,8), (3,4), (6,23)}であると予想しています。

取得した出力は{(1,6), (1,10), (3,4), (3,8), (6, 23)}です。

ご覧のとおり、標準の<演算子を使用してオーバーロードしないで得​​られる出力が得られます。だから私はこれが問題かもしれないと思って、(3,4) < (3,8)をチェックしました。この場合、私のオーバーロードされた演算子に応じて、答えはfalseとして返されました。ではどこが間違っていますか? sortが過負荷演算子の影響を受けるのはなぜですか?同様の問題については、いろいろな質問がありますが、助けられたものは見つかりませんでした。

+0

@ LightnessRacesinOrbit:はい、しました。あなたには何が間違っていますか? – therainmaker

答えて

11

std名前空間のペアにはすでにoperator<が定義されています。これは、使用しているstd::sortのバージョンで見つかったものです。あなたの過負荷は決して見つかりません。代わりに、名前の述語を使用してください:

struct MyPairComparator 
{ 
    bool operator()(const std::pair<int, int> & a, 
        const std::pair<int, int> & b) const 
    { 
     // ... 
    } 
}; 

sort(test.begin(), test.end(), MyPairComparator()); // ADL, maybe 
//        ^^^^^^^^^^^^^^^^^^ 

また、述語は定数値で呼び出し可能である必要があり、そのいずれかの値またはconst参照で引数を取ります。

sortは、std名前空間に存在します。対照的に、mainに式<を使用すると、実際にはグローバル名前空間の独自のオーバーロードが検出されます。

+0

次に、 'a therainmaker

+3

@therainmaker:更新されました。 'std :: less'は、(通常は)' <'を使う標準ライブラリの名前付き述語ですが、ユーザ型に特化しているかもしれません。順序コンテナはデフォルトのコンパレータとしてそれを使用しますが、アルゴリズムは通常、述語バージョンに対して別個のオーバーロードを持ちます(@TCが指摘したように、非述語形式は['std :: less ' C++ 14](http://stackoverflow.com/questions/20317413/what-are-transparent-comparators))。 –

1

C++ 11コンパイラを使用しているようですが、ラムダ関数を使うのが簡単です。何かのように

sort(test.begin(), test.end(), [](const pair<int, int> & a, const pair<int, int> & b) { 
    if (a.first < b.first) return true; 
    else if ((a.first == b.first) && (a.second > b.second)) return true; 
    return false; 
}); 
+2

私はこれが改善しているとは思わないが、特にその述語を再利用したいと思っている。しかし、多分それは私だけです。 – TartanLlama

+10

「C++ 11コンパイラを使用しているようですが....」次に、C++ 14の機能を使用します。 –

+0

@ T.C。申し訳ありませんが、私の悪い。それを指摘してくれてありがとう。修正されました。 – Shreevardhan

関連する問題