2017-08-11 4 views
0

アルゴリズムヘッダーを使用しますが、私は非常に単純なタスクを実行したいと思います私はちょうど私が希望algorithm headerソートstructArrayは私がゼロ運といくつかの例を見てきました

struct MyStruct 
    { 
     int level; //sort according to this 
     int m; 
     char ks; 
    }; 
    int main() { 

    MyStruct* ary = new MyStruct[SIZE]; 
    sort(ary, ary + tota_stored); //this part 

     for (int j = 0; j <tota_stored; j++) 
     { 
      cout << ary[j].level<< ary[j].m<< ary[j].ks<< " \n"; //print sorted 
     } 

    return 0; 
    } 

を使用して構造体をソートしたいと思いますそれは私の構造体にlevel変数に基づいて分類することが

+0

std :: sortは、比較演算子を使用してカスタム演算子を渡すことができます。このような述語を使用する方法を知ることで、問題が解決されます。何を試しましたか? –

答えて

3

あなたははstdするpredicatを与えることができます::

のようなソートを
std::vector<MyStruct> ary(SIZE); 
std::sort(ary.begin(), ary.end(), [](auto a, auto b){return a.level < b.level;}); 

まず、私はencouraあなたはC++のモダンではnew, new[], delete, delete[]を使用しないでください。 コンテナとスマートポインタを使用する方が良いです(ここではstd::vectorを使用しています)

次に、意味は:[](auto a, auto b){return a.level < b.level;}です。

ラムダと呼ばれる「オブジェクト」です。ラムダは、ちょっと機能のようなものかそのようなものです。この関数は2つの引数をとります:aとbは、コンパイル時に自動的に導き出されます(自動のおかげで)。

機能全体がプリディカートと呼ばれるものです。ここでは、レベル部分のみを比較したいので、私はa.level < b.levelを使用しています。

また、あなたがここにstd::sort機能のドキュメントをチェックすることができます:あなたが見ることができるように http://en.cppreference.com/w/cpp/algorithm/sort

を、私はこの1つ使用しています:

template< class RandomIt, class Compare > 
void sort(RandomIt first, RandomIt last, Compare comp); 

Compare compをここで私はで定義されたpredicatがありますラムダ。ここでラムダhttps://stackoverflow.com/a/7627218/4950448

ミカエルロイが示唆のように、あなたがC++ 98を使用しなければならない場合は、あなたが「ファンクタ」を使用することができます(名前がわからない)

struct CompareStructOperatorLess { 
    bool operator()(const MyStruct &a, const MyStruct &b) const { 
     return a.level < b.level; 
    } 
}; 
... 
std::sort(ary.begin(), ary.end(), CompareStructOperatorLess()); 
2

について

詳しい情報C++ 11以降では、Antoineのラムダ関数ベースのソリューションを使用できます。 C++ 98を使用する必要がある場合、またはlevelデータメンバーがの構造データを比較する意味のある値である場合や、多くの比較を行う予定の場合や比較が複雑な場合は、構造体の値を順序付けるのに役立つ演算子。

struct MyStruct 
{ 
    int level; //sort according to this 
    int m; 
    char ks; 

    friend inline bool operator < (const Mystruct& a, const MysStruct& b) 
    { 
     return a.level < b.level; 
    } 
}; 

int main() 
{ 
    MyStruct* ary = new MyStruct[SIZE]; 
    size)t total_stored = SIZE; 
    sort(ary, ary + total_stored); // <-- operator < will be called. 

    for (int j = 0; j <tota_stored; j++) 
    { 
     cout << ary[j].level<< ary[j].m<< ary[j].ks<< " \n"; //print sorted 
    } 

    return 0; 
} 
+0

C++ 98では、 "ファンクタ"も使用できます;) –

+0

完全に真です。より高度なソートオプションを実装するための必要条件。 –

関連する問題