• 締切済み

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

iyomanteの回答

  • iyomante
  • ベストアンサー率60% (14/23)
回答No.1

std::list::sort()は operator< () をオーバーロードします。 ただポインタのリストの場合はこれはそのままでは使えないので、参考URLで近いことがやってあるようです。 ----------------------------------------- 変数一個でソートするだけならmultimapにしてみては #include<map> class TestList { protected: std::multimap<int, TestList*> RunList; int a; //この変数でソートする public: void MakeList(TestList *test); //リストを"RunList"に登録する }; void TestList::MakeList(TestList *test) { typedef std::pair<int, TestList*> type_it; RunList.insert(type_it(test->a, test)); }

参考URL:
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200312/03120061.txt
satou386
質問者

補足

->参考URLで近いことがやってあるようです。 回答、ありがとうございます。 「TestList*」を渡した時の「greater」の比較を「x > y」から「x->a > y->a」に変更しているのは、 何となく理解できました。しかし、具体的にどう書けばいいのか全く解りません。 リンク先を参考にして「クラス"TestList"」に『追加』した所、C2143などのエラーが出てダメでした。 #using <mscorlib.dll> #include<list> using namespace System; using namespace System::Collections::Generic; class TestList //他のメンバは省略しています。 { public: typedef TestList* ts; template<> greater<ts>::bool operator() (const ts &x, const ts &y) const { return x->a > y->a; } }; ----------------------------------------------- ->変数一個でソートするだけならmultimapにしてみては リスト実行中に、全リストのメンバaを書き換え、 さらに、1秒間あたり数十回ソートする必要があるので 向いてなさそうです。

関連するQ&A

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

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

  • 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 の大小でソートしたいのですが、どうにもやり方が分りません。。。 教えていただけないでしょうか。 よろしくお願いします。

  • 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<をオーバーロードする方法が見つかったのですが........

  • List内の数字(string型)を並び替えたい

    c sharp 環境です。 たとえばですが、 List<string> testlist = new List<string> (); testlist.add("1"); testlist.add("12"); testlist.add("3"); testlist.add("4"); … として、testlist.Sort();で並び替えると、中が文字列なので 1、12…の順番になってしまいます。 これを数字の昇順にしたい(1、2、3…)のですが、可能でしょうか? 数字型のListなら話が早いのですが、そうもいかず…。

  • ListのSort

    Visual C++ 2005/CLIにてWindowsアプリケーションを作成しています 三つの要素があるListのbの要素でソートしたいのですが、どうしたら よいでしょうか? public ref class Test { private: a; b; c: } void main() { List<Test^>^ test = gcnew List<Test^>; //ここ test->Sort(); // <-ここがわかない }

  • STLについて

    VC++6を使っています。ベクタを戻り値とするプログラムを書いています。効率が悪く感じるのですが、STL?ではこういうやり方は正しいのでしょうか? また、一般的にSTLで引数や戻り値を扱う場合、どのようなタイプ(string?)を使えば、効率よく、きれいなプログラムが書けるのでしょうか? class A{ ... } vector<A> test(void){ vector<A> ret; for (int i = 0; i < 1000; i++){ ret.push_back( A(i) ); } return ret; } vector<A> a = test(); // 巨大なコンテナが返され、aにコピーされる? ※基本的に戻り値の仕組みが理解不足です。 char *の場合は、char配列のポインタが返され、新たな変数にポインタ値がコピーされるという解釈で結構ですか? char * sample(void){ char *p = new [1000]; return p; } char *q = sample();

  • C言語のリストのソートについて質問します。

    C言語のリストのソートについて質問します。 こんばんは、aida13です。以前の質問が自己解決しました。回答者のみなさん本当にすみませんでした。 今回はそのアルゴリズムで改善したい点がありましたので投稿させていただきました。以下のソートを実行するとソート自体はうまくいくのですが、見ての通りwhileやifなどを使って何度も実行しなおさないと完全にソートできません(「5 4 3 2 1」→「4 3 2 1 5」(一回ソート))。これを一回でソートできるようにしたいのです。また、降順も同様にそのままsecondとheadを入れ替えたのですが…今度は何度やっても「1 2 3 4 5」→「2 1 3 4 5」(一回ソート)からそれ以上動きません。アドバイスをお願いします。また、出来る限りこの形を保てる形でお願いします。 以下自作ソート #include < stdio.h > #include < stdlib.h > struct ans { int data; struct ans *next; }; struct ans *sort_up(struct ans *head) { int temp; struct ans *second_head; second_head = (struct ans *)malloc(sizeof(struct ans)); second_head = head->next; if( head->next == NULL ) { return head; } else { if( head->data > second_head->data ) { temp = head->data; head->data = second_head->data; second_head->data = temp; sort_up(head->next); } else { sort_up(head->next); } return head; } } struct ans *add_list(int x, struct ans *head) { struct ans *new_head; new_head = (struct ans *)malloc(sizeof(struct ans)); new_head->data = x; new_head->next = head; return new_head; } void show_list(struct ans *head) { if( head == NULL ) { printf("\n\n"); } else { printf("%d ",head->data); show_list(head->next); } } void main() { struct ans *head; head = NULL; head = add_list(1,head); head = add_list(2,head); head = add_list(3,head); head = add_list(4,head); head = add_list(5,head); do { printf("input:"); scanf("%d",&a); if(a==0) { head = sort_up(head); show_list(head); } } while(a==0); }

  • リスト構造のソートにおいて

    リスト構造のソートにおいて 下記の//■ここの( p->next )->key )が、一番最後のpになった時に p->nextが何も指していないコードだと、MFCだとエラーで落ちてしまうのですが コンソールアプリだと落ちません。(私の勘違いでなければ) そんなことが有るのでしょうか? (下記コードとは関係なしにどんなコードでも良いのですが) while ( p != NULL ) { /* キーが超えたら */ if ( ( key <= p->key && p->next == NULL ) || ( key <= p->key && key > ( p->next )->key ) ) {  //■ここ /* ポインタのつなぎ換え */ wk = p->next; p->next = new_p; new_p->next = wk; /* リストにデータを登録 */ new_p->key = key; strcpy( new_p->name, str ); return head; } p=p->next; }

  • STL vectorの初期化

    STL vectorの初期化についてなんですが 以下のようなクラスのprivateなメンバ変数としてvectorを定義し それをメソッド内のループ処理にて初期化しながら使用したいのですが 初期化の仕方が分かりません。コンストラクタを呼べば初期化されるようですが 以下のようにヘッダとソース内で2度同じような宣言をしてしまっても問題ないのでしょうか? //=== test.h === class test { private : vector<int> array; public : int fnc(); }; //=== test.c === int fnc() { for (int i = 0; i < 10; i++) { //★ここで初期化したい vector<int> array;  ←これで問題ないか? for (int j = 0; j < 10; j++) { array.push_back( md ); } } } C#などでは宣言とインスタンス生成を別に分けられたのですがC++も同様の事が出来るのでしょうか? 一応「array = new vector<int>;」といれて見たのですがエラーが出ました。

  • STLを使わずに可変長配列を再現する方法

    STLのlistが(配列に比べると)想像以上に遅かったので C++で可変長配列を再現したいのですけども 配列の拡張が思った以上に遅く困っています。 毎回newではオーバーヘッドが発生しますので、 現在は配列を一定数確保しておき 足りなくなったら配列を拡張(再確保)しています。 現在の配列のアドレスを一旦退避させてdeleteし、 新たにnewで生成して復帰させるといった感じです。 ただしこれでは、配列の要素数が増えるほど遅くなり、 オブジェクトの参照ならまだしも実体の場合は 全てコピーしなければならないので、 場合によってはSTLのlistよりも遅くなってしまいます。 newで生成してるのでできればreallocは使わずに 再現したいのですが、どうにか方法は無いでしょうか? よろしくおねがいします。 //----------------------------------------------- struct Test {   int val;   Test( int _val ){ val=_val; } }; Test obj1( 1 ); Test obj2( 2 ); Test obj3( 3 ); // 元のデータに代入 Test **ptr = new Test*[2]; ptr[0] = &obj1; ptr[1] = &obj2; // 退避させる Test **tmp = new Test*[2]; for( int i=0; i<2; i++ ) tmp[i] = ptr[i]; // 拡張する delete [] ptr; ptr = new Test*[4]; // 復帰させる for( int i=0; i<2; i++ ) ptr[i] = tmp[i]; delete [] tmp; ptr[2] = &obj3; //----------------------------------------------- ※NULLチェックなどはここでは省いています。