ペア

2013-08-07 1 views
12

Heyho、ペア

のベクトルをソート私はペアのベクトルをソートについて質問があります:

std::vector<std::pair<double,Processor*>> baryProc; 

このベクトルはすでにペアで埋めています。 今私はペアの内側に二重の値に基づいて、ベクトル内のペアをソートしたかった

例:

iは、ベクトル内の3つのペアを持っていると仮定します。ペア1は正面にあり、ペア3は最後にあります。 pair2が真ん中にあります:

pair1(1, proc1) 
pair2(3, proc2) 
pair3(2.5, proc3) 

今、私は二重の値に基づいてペアを並べ替える必要があります。ベクター内の順序は次のとおりです。

pair1(1, proc1) 
pair3(2.5, proc3) 
pair2(3, proc2) 

どうすればいいですか?私はかなり固執しています。 C++では、ヘルプ

答えて

22

ため

おかげで、あなたは、ソートするときに一つの要素が他の前に行くかどうかを決定する方法を指定するカスタムコンパレータ機能を持つことができます。あなたのケースでは、2つのペアが与えられた場合、最初の要素の値が小さいほうがもう一方の要素の前に移動します。あなたはそのようにコンパレータ機能を書き込むことができます。

//The sort function will use your custom comparator function 
std::sort(baryProc.begin(), baryProc.end(), pairCompare); 
+1

+1 '.second'比較を' std :: pair'の通常のless-operatorから削除した良い例です。私はこれのためのファンクタ(インラインにする可能性が高い)を好むだろうが、機能的なソリューションは無限に働く。 – WhozCraig

+0

この良い説明をありがとう。私は標準のコンパレータが正常に動作すると思います。二重の値がしばしば同じであれば、標準的なオパレーターのソートが正しいでしょうか? 例:(1、proc1)、(1、proc2)、(2、proc3)、(3、proc4)、(3、proc5)、... – user2633791

+1

@ user2633791あなたが求めているのは、 [安定](http://en.wikipedia.org/wiki/Stable_sort#Stability)。並べ替えアルゴリズムは、同じ値を持つ2つの要素が、並べ替えの終わりに同じ順序で、最初と同じ順序で残っていれば安定しています。デフォルトソートアルゴリズムは安定していませんが、STLはあなたの目的に合った[安定ソート](http://www.cplusplus.com/reference/algorithm/stable_sort/)を提供しています。 – maditya

25
#include <algorithm> 

int main(){ 

    std::vector<std::pair<double,Processor*>> baryProc; 

    std::sort(baryProc.begin(),baryProc.end()); 
} 

(注)のデフォルトのコンパレータためのカスタムコンパレータを必要としません:

// This function returns true if the first pair is "less" 
// than the second one according to some metric 
// In this case, we say the first pair is "less" if the first element of the first pair 
// is less than the first element of the second pair 
bool pairCompare(const std::pair<double, Processor*>& firstElem, const std::pair<double, Processor*>& secondElem) { 
    return firstElem.first < secondElem.first; 

} 

、あなたのソート方法には、この関数を渡しますペアはあなたが望むことをします。最初に最初の要素と比較し、一致した場合はペアの2番目の要素を比較します。

+0

この*は 'double '値が一意に保証されている(事実上"セット ")ことを保証します。コンパイラを書く必要があります) 'pair 'のデフォルトコンパレータは通常、' return(a.first WhozCraig

+0

最初の要素が同じときに何をするのかを助ける条件はありません。 ? –

+0

なぜ 'std :: vector'と' std :: pair'を指定しましたが、 'std :: sort'では指定しなかったのですか?そうした場合、' using namespace std'ビットを完全に取り除くことができます。 – Kevin