• ベストアンサー

STLでポインタのリストをsort()する方法を教えてください

STLのsort()の使い方が分からず困っています。 定義したクラスから生成したオブジェクト群を list で管理しています。 ↓こんな形です。 class cMyClass { int m_Attr; public: cMyClass(); ~cMyClass(); }; std :: list <cMyClass*> m_MyList; m_MyList.push_back(new cMyClass); m_MyList.push_back(new cMyClass); ... この、m_MyListを cMyClass内の要素 m_Attr の大小でソートしたいのですが、どうにもやり方が分りません。。。 教えていただけないでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

#include <list> #include <cstdlib> #include <ctime> #include <iostream> class cMyClass { public: /* getter,setterを作るべきなのかわからん。一応比較用の関数で参照するのでpublicにした */ int m_Attr; cMyClass(){ m_Attr = std::rand(); } ~cMyClass(); }; bool cMyClass_compare(cMyClass* a, cMyClass* b){ if (a->m_Attr < b->m_Attr){ return true; }else{ return false; } } int main(void){ std::srand(std::time(NULL)); std :: list <cMyClass*> m_MyList; m_MyList.push_back(new cMyClass); m_MyList.push_back(new cMyClass); m_MyList.push_back(new cMyClass); m_MyList.push_back(new cMyClass); m_MyList.push_back(new cMyClass); m_MyList.push_back(new cMyClass); m_MyList.sort(cMyClass_compare); for (std::list<cMyClass*>::iterator it=m_MyList.begin(); it!=m_MyList.end(); ++it){ std::cout << " " << (*it)->m_Attr; } }

Nobita1000
質問者

お礼

早速の回答ありがとうございました。 早速試して、動作が確認できました。 ありがとうございました!

その他の回答 (1)

回答No.2

 こんばんは。こんな感じ?  Set/Getが無かったのでstatic/friendで触るようにしてます。 #include<stdio.h> #include<list> class cMyClass { int m_Attr; public: explicit cMyClass(int attr) : m_Attr(attr){} ~cMyClass(){} //static members //operator < (l, r)へ転送 static bool Less(const cMyClass* p, const cMyClass* q) { return *p < *q; } //std::for_eachのコールバック用(表示する) static void Display(const cMyClass* p) { ::printf("[m_Attr:%d] [pointer:%p]\n", p->m_Attr, p); } //operator //二項演算子 friend bool operator < (const cMyClass& lhs, const cMyClass& rhs) { return lhs.m_Attr < rhs.m_Attr; } }; //test void main() { std::list <cMyClass*> m_MyList; m_MyList.push_back(new cMyClass(50)); m_MyList.push_back(new cMyClass(3)); m_MyList.sort(&cMyClass::Less); std::for_each(m_MyList.begin(), m_MyList.end(), cMyClass::Display); }

Nobita1000
質問者

お礼

早速の回答ありがとうございました。 早速試して、動作が確認できました。 ありがとうございました!