• ベストアンサー

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
質問者

お礼

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

関連するQ&A

  • STLのList.sortが上手く使えない

    VC++2005のSTLの、List.sort()を使ってメンバ変数aでソートしたいのですが上手くいきません。 MSDNで"IComparerをオーバーロードしろ"と、書いてあったのを見て、 いろいろ調べて試してはみたのですが、理解不足のため全て失敗しました。 ネットに転がっているサンプルはC#のモノばかりでサッパリです。 調べる手段も分からず八方塞な状態です。どうかお力を貸してください。お願いします。 class TestList { protected: std::list<TestList*> RunList; int a; //この変数でソートする public: MakeList(TestList *test); //リストを"RunList"に登録する }; void main() { TestList Test(); //全てのリストはココに登録 Test->MakeList(new TestList()); Test->MakeList(new TestList()); Test->RunList.sort(); //←ココ。メンバ変数aでソートしたい } 【追記】MSDNの方法では"mscorlib.dll"が必要になります。 もし可能なら違う方法になったとしても、使うことなくソートできるなら、その方が良いです。

  • STLのlistのソートについて教えてください。

    STLで何か作ってみようと思っているのですが、複数のメンバを持つ構造体オブジェクトのリスト(要素の値が構造体オブジェクトであるリスト)を、その構造体オブジェクトのメンバの中の1つのをキーとして昇順、又は降順にソートしようとした場合、どのようにすればよいのでしょうか?? http://www5c.biglobe.ne.jp/~ecb/cpp/07_08.html ここを見ると、sort() という関数があるようですが、単に昇順でソートする、としか書いていなく、構造体のリストのソートはどうするのだろうと疑問です。 詳しい方いらっしゃいましたらご教授頂けると幸いです。

  • STLのlist どのデータでソートするか分からないデータでソートを行うには?

    class data { public: 文字列型* str; //コンストラクタでN個の配列を生成 int N; //文字列の配列の個数 }; list<data> obj; と書いて、objに対して大量にデータを追加した後、その要素をソートするところで困っています。 データを文字列型のデータの配列の特定のオブジェクトを使ってソートするのに、その方法が見つかりません。 リストのデータの一つ目 str[0] = "abc"; str[1] = "def"; リストのデータの二つ目 str[0] = "ghi"; str[1] = "jkl"; というリストのデータがあったときに、str[0]の要素でソートしたいということなのですが........ メンバのint型などについては、operator<をオーバーロードする方法が見つかったのですが........

  • テンプレートクラスとSTLを利用したMyListクラス

    こんにちは。STLのリストを使い自分だけのMyListクラスを作ろうとしたのですが、コンパイルできません。 エラーメッセージは警告 std::list<T>::iterator' : 依存名は型ではありません。 とでます。 ご教授お願いします。 #include<list> #include<iterator> template <class T> class CMyList { public: CMyList(); //virtual ~CMyList(); //bool HasNext(); //T Next(); //void Pushback( T t ); //void EraseCheck(); //T GetFirst(); private: std::list< T > m_List; std::list< T >::iterator m_It;//コンパイルエラー }; template <class T> CMyList<T>::CMyList() { m_List.clear(); std::list< T > ::iterator it = m_List.begin();//こう宣言する分にはOK m_It = m_List.begin(); } int main() { CMyList<int> m_List; return 0; }

  • STL関数listの中に作ったclassへのアクセス方法

    c++でSTLのlistを使いクラスをリスト化しようと考えて以下のようなプログラムを作りました.以下のプログラムはビルドは出来、実行できたため値は代入出来てると思うのですが, coutによって"zzの任意の番号(例えば3)の値を調べようと思ったとき,どのように書いていいのか,色々調べたり,実行したりしても分からなかったので,教えて下さい. ちなみに、このプログラムは数学での(x,y)座標の値を代入していくプログラムをイメージして作っています. #include <list> #include <iostream> using namespace std; class Coordinates { public: double x; double y; }; int main() { list<Coordinates> zz; Coordinates xy; for(int i=0; i<5; i++) { xy.x = i; xy.y = i; zz.push_back(xy); } }

  • STLのlistで重複するものだけを取り出す方法

    C++でVC++7.0を使用してプログラミングを学んでます。 ひとつハマっているのですが…、 STLのlistを利用して、重複するデータのみを一つにしたlistにしたいです。 例えば std::list<std::string> [1] bbb [2] aaa [3] bbb [4] ccc [5] eee [6] ddd [7] bbb [8] ccc と格納されたlistがあった場合に、 [1] bbb [2] ccc と2つ以上あるデータを1つのみ格納するようにしたいです。 重複するデータを省く処理なら思いつくのですが… (.sort()で重複するデータを並べ、.unique()で重複するデータを削除する) 上記のようなことは可能でしょうか? 何か有効な案がありましたら是非ご教授下さい!

  • コンストラクタ内でのthisポインタ

     当方、プログラム暦1年の者です。少しわからないことがあるので、ご教授お願いします。  親クラスにstaticなlistを配置し、子クラスがnewされたときに、listに加えていき、好きななタイミングで、自クラスと、継承クラスのインスタンスをすべてdeleteするプログラムを組もうとしています。 コードは /**@brief Base*/ class Base { public: Base(){ List.push_back(this);} virtual ~Base(){//リストから自分を取り除くコード} static std::list<Base*>List; static DeleteAll() {//リスト内のリストをすべてdeleteるる} }; /**@brief Deri1*/ class Deri1 :public Base { public: Deri1(){List.push_back(this);} ~Deri1(){} }; /**@brief Deri2*/ class Deri2 :public Base { public: Deri2(){List.push_back(this);} ~Deri2(){} }; //テストコード int main() { Base*p0 = new Deri1; Base*p1 = new Deri2; //ここですべてのインスタンスが解放される(?) Base::DeleteAll(); return 0; } でここで気がかりが。  継承した際、コンストラクタ内のthisポインタは、変化することもある。という話を聞いたことがあり、もしそれが本当なら、これは上手く動きません。自分でいくつか実験してみましたが、どの結果も、Baseのコンストラクタ内でのthisとDeriNのコンストラクタ内でのthisは同じでした。同じでなくなる状況とは具体的にどのようなときなのでしょうか?また、上の情報はガセネタなのでしょうか?  コンパイラはVS2005standard。です。  

  • STL に適合するようにクラスを書くとき皆さんはどうしているのでしょう

    大した質問ではないのですが、例えば適当に vector っぽいクラスを template<typename T> class HeppokoVector { private:  いろいろ省略 public:  void push_back(T const& val); }; のように設計したとしましょう。ヘッポコとは言え vector なので STL の std::copy を使って、HeppokoVector<char> hoge; に既存の vector<char> foo; の内容を std::copy(foo.begin(), foo.end(), std::back_inserter(hoge)); な感じでコピーしたいと思いましたが、コンパイルすると 「reference : は HeppokoVector<T> のメンバーではありません」 などと怒られます。back_insert_iterator の定義を見れば、reference や const_reference の定義が必要なので、 template<typename T> class HeppokoVector { private:  いろいろ省略 public:  typedef T& reference;  typedef T const& const_reference;  void push_back(T const& val); }; な風に修正するわけですが、皆さんは自前でコンテナを作る時などに、あらかじめ「コレコレの typedef は必要だな」とか知った上で作成しとるのでしょうか? きっと私が適当なだけなのでしょうが、back_insert_iterator のドキュメントを見ても、push_back が必要であることしかわかりませんでした。

  • C++でのSORT

    受験番号(int型)と成績(int型)からなる表(可変長)を成績順に並び替えるsortを例えばSTLを使って実現したいと思います。 そこで、構造体をvectorコンテナにのせることを考えました。ですが、push_backの扱い方が間違っているようです。STLのSORTを使う知識以前に、複数要素を持つコンテナが作れません。 受験番号  成績 1     65 2     92 3     95 を 受験番号  成績 3     95 2     92 1     65 に並び替える。 #include <vector> #include <algorithm> struct goukakusya { int number; int score; }; main() { vector<goukakusya> table1; table1.number.push_back(1); table1.core.push_back(65); table1.number.push_back(2); table1.core.push_back(92); table1.number.push_back(3); table1.core.push_back(95); } よろしく、御願いします。

  • C++/STLの動作

    お世話になっております。 クラスのインスタンス化時に自身のポインタをストックしようと下記を実行しましたが、 出力が0となり、予想に反していました。 そこで、"test.cpp"の3行目を"main.cpp"に移動すると正しく動作します。 これはどういった動作が原因で起こったのでしょうか? よろしくお願いします。 /// test.h /// #include <vector> class Test { public: Test(){list.push_back(this);} static std::vector<Test*> list; }; /// test.cpp /// #include "test.h" std::vector<Test*> Test::list; /// main.cpp /// #include <stdio.h> #include "test.h" Test test; void main() { printf( "%d\n", test.list.size() ); // "1"と出力されると思ったけど… }