2009-08-18 30 views
0

私は並べ替える必要があるintの膨大な配列を持っています。ここでキャッチするのは、リスト内の各エントリには、ソートされたときにそのintに従う必要のある他の関連要素が多数あるということです。私は並べ替えを変更してintの代わりにdoubleをソートすることで、この問題を解決しました。ソート前に値の元の位置を示す小数部でソートされる前に、各番号にタグを付けました。これにより、関連付けられたデータを参照できるようになり、すべての関連要素でソートされたリストを効率的に再構築できます。stable_sort()を使用してdouble型をint型としてソート

私の問題は、関数stable_sort()を使ってint値で2つの値をソートしたいということです。

私はこのWebページを参照しています:http://www.cplusplus.com/reference/algorithm/stable_sort/

をしかし、私は新しいプログラマだので、彼らが動作するようにint型でのソートを得ることができたか、私はかなり理解していません。機能を動作させるために第3引数に入れるべき正確なものは何ですか? (私はちょうどそれをコピーして貼り付けることができ、それを動作させることができますが、私もこれを学び理解したいと思っています)。

おかげで、

-Faken

編集:私は正式なプログラミングのトレーニングを持っていなかった新しいプログラマだことに注意してください。私はあなたの説明をできるだけ簡単かつ初歩的にしてください。

要するに、前もってC++コードを見たことがないかのように私を扱ってください。

+0

は、表す余分な整数フィールドを追加するほうがよいのではないだろう比較機能の元の位置とデラですか? – sharptooth

+0

このデータは関連データについて正確には何ですか?それはほとんど確実に良くなる可能性があります。あなたが実際にやっていることを教えてください。 – GManNickG

+0

@sharptooth:私はあなたの言うことをよく理解していません。以前私は、独自のマージソートアルゴリズムを作成しようとしていました。このアルゴリズムは、元の位置を追跡するために、添付された第2のリストを持つリストをソートします。それでは、関数stable_sort()について知りました。既にこれを行うことができる別の標準関数があれば、教えてください。 – Faken

答えて

4

あなたはベクトルに慣れていないと言います(あなたは本当にSTLコンテナをできるだけ早く学ぶべきです)ので、私はあなたが配列で遊んでいると仮定します。これらの線に沿って何か:f(a, b) - - 、括弧でそれに従うことにより、関数のように呼び出すことができるものである

int a[] = { 3, 1, 2 }; 
std::stable_sort(&a[0], &a[3]); 

stable_sortの第三のオプションの引数f関数オブジェクトです。関数(またはむしろ1つの関数へのポインタ)は関数オブジェクトです。他の種類には、オーバーロードされたクラスoperator()が含まれますが、あなたの目的のために、普通の関数がおそらく実行します。比較のいくつかの方法を持っている必要がありますstable_sort(本当に、または何か)これをソートするには

struct foo { 
    int n; 
    // data 
    ... 
}; 

foo a[] = { ... }; 

、:

今、あなたはintあなたがソートに使用するフィールド、およびいくつかの追加のデータを使用してデータ型を持っていますどちらが大きいかを見るための任意の2つの要素。デフォルトでは、オペレータ<を使用して比較します。要素型がそれを直接サポートしていれば、それはです。明らかに、intはそうです;あなたの構造体のためにoperator<をオーバーロードすることも可能ですが、それも拾い上げられますが、別のアプローチについて尋ねました。

第3引数は次のとおりです。提供されると、stable_sortは、比較の必要があるたびに呼び出しを行い、2つの要素を呼び出しの引数として渡します。呼び出される関数(または一般的な関数オブジェクト)は、最初の引数がソートの目的で秒未満の場合はtrueを返し、それ以上の場合はfalseを返します。つまり、演算子<のように動作する必要がありますあなたが物事を比較する方法を定義すること)。 fooの場合は、nを比較し、残りはそのままにしておきます。だから、:

bool compare_foo_n(const foo& l, const foo& r) { 
    return l.n < r.n; 
} 

そして今、あなたはstable_sortに(その名前で簡単に表される)この関数へのポインタを渡すことによって、それを使用します。

std::stable_sort(&a[0], &a[3], compare_foo_n); 
+0

+1で説明してください。 – Naveen

+0

ああありがとう、私は今理解していると思う。つまり、関数がリストをソートする方法を制御することもできます。つまり、コンパレータとして<を使用すると、最も低いものから最も高いものが得られます。>私が>悪い場合は、最も低いものから最も低いものを取得します。 – Faken

3

比較関数を渡す必要があります。

bool intCompare(double first, double second) 
{ 
    return static_cast<int>(first) < static_cast<int>(second); 
} 

int main() 
{ 

    std::vector<double> v; 
    v.push_back(1.4); 
    v.push_back(1.3); 
    v.push_back(2.1); 
    v.push_back(1.5); 

    std::stable_sort(v.begin(), v.end(), intCompare); 



    return 0; 
} 

ソートアルゴリズムでは、値を比較するために、渡された比較関数が使用されます。より複雑なデータ構造を持ち、データ構造の特定の属性をソートしたい場合は、このユーザー定義関数を使用して値を比較することができます。

+0

C++のキャストを使用するための+1 – Yacoby

+0

うーん...ベクトルは何ですか? push_back?申し訳ありませんが、この説明はあまりにも進んでいます。 – Faken

+0

「ベクトル」が何であるかわからない場合は、おそらくあなたがやっていることを試す準備ができていないでしょう。良い本を手に入れて、よく言葉を学んでください! – GManNickG

2

私はあなたがこの機能について話していると信じて:

bool compare_as_ints (double i,double j) 
{ 
    return (int(i)<int(j)); 
} 

と関数呼び出し:

stable_sort (myvector.begin(), myvector.end(), compare_as_ints); 

機能compare_as_intsは通常の関数であるが、これは関数としてstable_sortに渡されますポインタ。すなわち、内部でstable_sortによって値を比較するために使用される関数のアドレスが渡されている。

これについては、これが不明な場合はfunction pointer tutorialをご覧ください。

関連する問題