• ベストアンサー

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

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

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

>list::sortの使い方がよくわかりません。 普通に data 用の比較関数を作ればよいはずです。 比較方法を都度切り替えたいような場合は、関数オブジェクトにするのもよいでしょう。

sirn
質問者

お礼

なるほど、その方法を取り入れたいと思います

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

こうやってみたら、 bool obj_comp0(const data &d1, const data &d2) { return d1.s[0] < d2.s[0]; } obj.sort(obj_comp0);

sirn
質問者

お礼

問題の解決方法ありがとうございます

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

std::list<data>::sortに、比較用の関数オブジェクトを渡すだけでは?

sirn
質問者

補足

class dataComp { public: int target; どの要素でソートするか int operator()(const DATA& l, const DATA& r){省略}; }; みたいな感じにしてlist<data>::sort(dataComp型オブジェクト)みたいにして使えばいいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>データを文字列型のデータの配列の特定のオブジェクトを使ってソートするのに、その方法が見つかりません。 よくわかりませんが、std::sort の使い方がわからないという意味ですか?

sirn
質問者

補足

list::sortの使い方がよくわかりません。 int型のリストでlist::sortを使えば普通に使えますが..........

全文を見る
すると、全ての回答が全文表示されます。

関連する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"が必要になります。 もし可能なら違う方法になったとしても、使うことなくソートできるなら、その方が良いです。

  • C言語のポインタと配列

    どうにも理解しようとしていますが全体像が理解できないので、わかっていることわからないことまとめていくのでバンバン指摘してくださるとうれしいです。 1.配列の宣言には int a[]; a[] = {1,2,3}ですが、コンピュータは{"1","2","3"}の部分の数を数えて[]に代入しているので、 int [][3] = {{1,2,3},{4,5,6}}のような配列を作ったとき[][3]の部分の左側の数字も勝手に代入している。 この時なぜ3が勝手に代入されないかがわからない 2.数字とメモリ int s = {1,2,3}をメモリ的に表現すると、123の順に並んでいる。s[1]=2 int s[][2] = {{1,2,3},{4,5,6}}をメモリ的に表現すると123456に並んでいる。s[1][1]= 5 ここまで文字列以外の配列は添え字だけで管理されている。 3.文字列とポインタ char s[] = "abc"とするとメモリ的にはabc\0であり、[]には4が代入され、s[1]はb自身を指す。 char *s = "abc"をメモリで表すとabc\0であり、\0が来るまでを文字列と認識する。 sは&s[0]とも表現できるように、最初のアドレスを指し示している。 char *s[]= {"abc","def"}をメモリ的に表現するとabc\0def\0であり、[]には2がコンピュータにより判断されて代入される。\0までを文字列として表現しようとする。s [1] は"def"の最初のアドレスを指し示すが、s[1][1]とするとe自身を指すようになる。この時、s[1] = &s[1][0]と表現することは可能であると考えられる。 文字列を直接さす場合でも、ポインタで表現する場合でも、\0が要素の最後に来るのでしょうか? また、{{"abc","def"},{"ghi","jkl"}}を文字列で直接表す場合は char s[2][2] = {{"abc","def"},{"ghi","jkl"}}; となるかと思いますが char *s[2][2] = {{"abc","def"},{"ghi","jkl"}}; とするとs[1][1]でghiの最初のアドレスを、s[1][1][0]でg自身を表せるようになるのでしょうか?

  • ソート処理

    ついこの間正規表現のことで質問させていただいたものです なんとか問題は解決しました それとは別にソート関連での質問があります 正規表現の前にソートについて質問してご回答を頂いてからそれを参考に試してみました http://oshiete1.goo.ne.jp/kotaeru.php3?q=1882190 です push で@tmpの内容を ($score,$filename,$title,$sentenceの順番に) 3.5 abc.txt あいうえお aaaaa 4.6 def.txt かきくけこ bbbbb 2.8 ghi.txt さしすせそ ccccc 5.1 jkl.txt たちつてと ddddd という風にしました このリストを @tmp = map {$_->[0]} sort {$a->[0] <=> $b->[0]} map {[$_, split /<>/]}@tmp; としたんですが結果は abc.txt あいうえお aaaaa def.txt かきくけこ bbbbb ghi.txt さしすせそ ccccc jkl.txt たちつてと ddddd 3.5 4.6 2.8 5.1 というふうになってしまいます これを スコア順に 5.1 jkl.txt たちつてと ddddd 4.6 def.txt かきくけこ bbbbb 3.5 abc.txt あいうえお aaaaa 2.8 ghi.txt さしすせそ ccccc としたいのですがうえのソースでは何がいけないんでしょうか??

    • ベストアンサー
    • Perl
  • エクセルで複数のデータからソートをかけて、合計金額を算出したいのですが

    エクセルで複数のデータからソートをかけて、合計金額を算出したいのですが、ソートではうまくいきません。 A列(文字)  B列(数値)  C列(金額) ABC 123 100 ABC 456 50 DEF 123 1,000 GHI 789 300 このような感じで、B列には同じ数値のものが複数あるデータです。 どなたかエクセルマスターの方、お教えいただけますか?

  • データをブロックごとに並べ替えるスクリプト

    データをブロックごとに移動して並べ替えたいのですが、 うまくいくスクリプトが書けず困っています。 APR_A----- abc 1 def 2 APR_B----- abc 3 def 4 APR_C----- abc 5 def 6 APR_A----- ghi 1 jkl 2 mno 3 APR_B----- ghi 4 jkl 5 mno 6 APR_C----- ghi 7 jkl 8 mno 9 のようなフォーマットのデータがあります。 これを以下のようにフォーマットを変えたいのですが、 awkを使ってどのようにスクリプトを書いたらよいでしょうか。 元データの中で、区切りの行は常にAPR_で始まっています。 APR_で始まる行に来たら次の列に移って2列目のみprint というのを繰り返し、APR_Aに戻ってきたら、 1列目(abc,defなど)、2列目ともprintして同様に繰り返す。 各ブロックの行数はまちまちです。(最初のブロックのように2行のブロックもあれば2番目のブロックのように3行のもあります) rowtitle APR_A APR_B APR_C abc 1 3 5 def 2 4 6 ghi 1 4 7 jkl 2 5 8 mno 3 6 9 分かりにくい文章ですが、理解していただけることを願っています。 よろしくお願いします。

  • 配列のソート

    Ruby初心者です。 例えば [12,38,121,273,13] [23,47,478,112,98] [56,73,227,556,12] [22,43,668,223,74] [33,13,393,763,91] を [12,38,121,273,13] [22,43,668,223,74] [23,47,478,112,98] [33,13,393,763,91] [56,73,227,556,12] のように第1列目の要素で配列ごとソートしたいのですが、私がやると、 [12,13,38,121,273] [22,43,74,223,668] [23,47,98,112,478] [13,33,91,393,763] [12,56,73,227,556] のように第一列の要素は一応ソートは出来ているのですが、 配列の中身まで並べ変わってしまいます。 配列ごとにソートするにはどうすれば良いのでしょうか?

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

  • 構造体のリストをソートしたい。

    ある名簿のリストを作りました。 以下のような構造体で、 typedef struct meibo{ char name[10]; int old; struct meibo *next; }MEIBO; これを、ポインタp->next->nameをたどっていって、名前が辞書順になるようにリストを作ったのですが、 これを年齢順にソートして表示させたいんです。 どんな方法があるんでしょうか? 一旦すべてを配列に格納して、クイックソート…とかも考えたのですが、すごく領域をとるし、なんか2度手間(最初から配列に順に格納していけばよかったなぁ・・・と。 それでもやっぱり最初から名列順にするときから配列に入れておくほうがいいのでしょうか? 教えてください。 (最初から年齢を比較してリストを作れば・・ってのはなしで、名列順のリストが存在するものとしてください。)

  • 一括置換をしたい

    ワード2003を使っています。 あるテキストデータの 「ABC」という文字列を「DEF」に置換したいんです。 同様に、 「GHI」を「JKL」に、 「MNO」を「PQR」に置換したいんです。 このように3つの文字列をボタンひとつで置換するにはどのようにすれば良いでしょうか? よろしくお願い致します。

  • バッチでfor文で文字列の中身を繰り返したい

    バッチで、for文で、半角スペースやタブ以外で区切られた文字列から、区切り文字毎に 取り出したいのですが、最初の1回しか取り出せません。最後まで繰り返しが行われませ ん。 バッチでは、そもそも、半角スペースやタブ以外では、文字列の中身を繰り返すことは できないのでしょうか。 それとも、他に良い方法があります。 やっていることは、 例えば、 for文で、スラッシュ「/」で区切られた文字列からスラッシュ毎に取り出そうとしている のですが、最初の1回目しか表示されず、最後まで繰り返しが行われません。 以下、色々と試したのですが..... set str=abc/def/ghi/jkl/mno/pqr/stu/vwx/yz for %%a in (%str%) do echo %%a の場合は、 1行そのまま表示されます。(あたりまえです。) for "delims=/" %%a in (%str%) do echo %%a for "delims=/" %%a in ('echo %str%') do echo %%a の場合は、 「"delims=/" の使い方が誤っています。」となります。 for /f "delims=/" %%a in ('echo %str%') do echo %%a の場合は、 最初の1回目の「abc」しか表示されず、そこで処理が終わり、残りが表示されない。 期待している結果は、 これを、 abc def ghi jkl mno pqr stu vwx yz と表示させたい。 set str=abc def ghi jkl mno pqr stu vwx yz for %%a in (%str%) do echo %%a の場合は、 abc def ghi jkl mno pqr stu vwx yz と表示されます。 バッチでは、そもそも、半角スペースやタブ以外では、文字列の中身を繰り返すことは できないのでしょうか。 できる場合、その方法を教えてください。また、他に良い方法がありましたら、教えて下さい。

印刷時に黒色だけ印刷できない
このQ&Aのポイント
  • エラ-も出てないのに黒色だけ印刷できない
  • お使いの環境はWindows10で、有線LAN接続されています
  • 関連するソフトやアプリは特にありません
回答を見る

専門家に質問してみよう