2013-05-12 6 views
5

カスタムクラスポインタのリストをソートする際に問題があります。並べ替えが必要なクラスはイベントです。これらはランダムな時間が割り当てられ、正しい順序でそれらを実行する必要があります。C++リスト内でカスタムオブジェクトを並べ替える

#include <list> 

Class Event{ 
public: 
float time; // the value which I need to sort them by 
int type; // to indicate which event i'm dealing with 

Event(float tempTime, int tempType) 
{ 
    time = tempTime; 
    type = tempType; 
} 


int main(){ 

std::list<Event*> EventList; 
list<Event*>::iterator it; 

......... 

この問題を解決するのに役立ちましたら、非常に感謝しています。私は今数時間これに固執してきました。

ありがとうございます!

答えて

1

これはstd::sortである必要があります。 std::sort関数の3番目の引数として渡すカスタムコンパレータ関数を作成するか、が自然に動作するように<演算子のオーバーロードを行うことができます。

+6

あなたは 'std :: list <> :: sort'を意味します。 'std :: sort'は' std :: list'には使用できません。これはランダムアクセスイテレータを持たないためです。 –

+0

カスタムコンパレータ関数を使ってみましたが、うまくいきません。 (そしてlist.sortを使って)j – user2374868

+2

また、 'operator <'のオーバーロードはポインタのソートに役立ちません。 –

10

リストにはオブジェクトではなくポインタが含まれているため、ポインタが指し示すオブジェクトを比較するカスタムコンパレータを用意する必要があります。 listを使用しているので、独自のsortメソッドを使用する必要があります。汎用std::sortアルゴリズムはランダムアクセスシーケンスでのみ動作します。リストには、オブジェクトが含まれている場合、それが提供するのは意味があります(それはおそらく必要として)

struct CompareEventTime { 
    bool operator()(Event * lhs, Event * rhs) {return lhs->time < rhs->time;} 
}; 

EventList.sort(CompareEventTime()); 

:あなたは過去に立ち往生しているとラムダを使用できない場合

EventList.sort([](Event * lhs, Event * rhs) {return lhs->time < rhs->time;}); 

または、代わりに比較演算子:

bool operator<(Event const & lhs, Event const & rhs) {return lhs.time < rhs.time;} 

std::list<Event> EventList; 
//... 
EventList.sort(); 
+0

ありがとうございました!最後のコメントは、私が何の理由もなくポインタを使用していたことを認識させました。したがって、私はそれを変更し、あなたの最後のソリューションを実装し、それは今完全に動作しています。 (btw。最後の解では、演算子関数内に1つの要素しか必要としないエラーが出たので、lhsを削除してthis->を代わりに使用しました。 – user2374868

+0

@ user2374868:はい、演算子を1つのメンバ関数引数ではなく、2つの引数を持つ非メンバの例です。 –

+0

リストの場合、List.Sort()を使用し、std :: Sort()を使用しないでください。 –

関連する問題