STLのsortでの条件付きソート方法について

このQ&Aのポイント
  • STLのdequeのソートで複雑な条件でソートする方法を教えてください。
  • sort関数の比較関数にユーザーパラメータを与える方法について知りたいです。
  • find_if関数のようにユーザーパラメータを与えてsortを行いたいです。
回答を見る
  • ベストアンサー

STLでfind_ifみたいなsortをしたいのですが。

こんにちは。 STLのdequeのソートで少し複雑な条件でソートしようとしています。 簡単なものでしたら、 sort( m_lists.begin(), m_lists.end(), fnComapreLower ) ; // bool fnComapreLower( lpElem0, sElem1 ) としてソートができますが、fnComapreLowerの比較関数にユーザーパラメータを 与えることはできないのでしょうか ? find_ifなら、 find_if( m_lists.begin(), m_lists.end(), _FINDER_ID( nnn )) ; として構造体を利用できるので便利なのですが、sortにも同様のことはできないのものでしょうか ? find_ifみたいに比較関数の他にユーザーパラメータを与えて処理したいのですが方法が分かりません。 もしご存じの方がいらっしゃいましたら教えていただけないでしょうか。

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

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

struc Hoge {  int n_;  Hoge(int n) : n_(n) {}  bool operator()(int A, int B) const { /* ここで n_ をつかう */  } }; sort( m_lists.begin(), m_lists.end(), Hoge(nnn)) ; という感じでできないですか?

shuuden
質問者

お礼

早々れレスありがとうございます。 できました!! いろいろ彷徨った結果かなり慌てていたようです。 bluecampusさんの解答で落ち着くことができました。 ありがとうございました。

関連するQ&A

  • STLのsortで、プライベート変数を比較関数に組み入れたい。

    STLのsortで、プライベート変数を比較関数に組み入れたい。 STLのvectorのsortで比較関数を指定してソートをしようとしております。 ソートしようとするvectorは、とあるクラスのプライベート変数であり、 同じクラスの他のプライベート変数を利用した比較を行おうとしています。 例えば int array[4] = {1, 7, 3, 5}; なるプライベート変数があり、比較関数はこんなアルゴリズムとしたいと。 bool compare(int left, int right) { return array[ left ] < array[ right ]; } この compare をクラスのメソッドとして定義して使えるのかなと思っていたのですが コンパイルしたところエラーが出ました。パブリック変数にして、プレディケートの ためのクラスを作って、そこでパブリックメソッドを作って……という方法は見つかった のですが、そのような面倒な方法を経なければいけないのでしょうか。

  • STLのmapのキーの変更方法

    // この時点でキーは"1,2,3,4,5"と並んでいる std::map< CString , int >::iterator it = m_mapNOKATA.find("3"); if( it != m_mapNOKATA ) { (*it).first = "9"; } というような使い方は出来るのでしょうか? また、これをした場合、 for( it = m_mapNOKATA.begin() ; it != m_mapNOKATA.end() ; ++it) { cout << (*it).first << endl; } とすると、結果は 1 2 4 5 9 となるのか、 1 2 9 4 5 となるのでしょうか? 上の結果が正しいように思えますが、だとしたら、キーを変更した時点で並べ替えが起きている? それとも、キーはinsert後はもう変更できなくて、erase→insertとしなくてはならないのでしょうか? 手元にSTL環境が無いので、確認できません。 どなたかお分かりの方がいらっしゃいましたら教えてください。 たぶん、multimapやsetでも結果は同じかと思います。

  • STL string::findで見つからなかった時

    STL string::findで見つからなかった時の 書式を教えて下さい。 <-----ソース start-------> #define UNCODE #define _UNCODE #pragma warning( push,3 ) #pragma warning( disable : 4786 ) // 識別子が '255' 文字に切り捨 #include <iostream> #include <string> #include <vector> #pragma warning( pop ) #pragma warning( disable : 4514 ) // 参照されていないインライン関数は削除 #pragma warning( disable : 4786 ) // 識別子が '255' 文字に切り捨 int wmain(int iArgC, wchar_t* ArgV[], wchar_t* EnvP[]) {  setlocale( LC_ALL, "Japanese" );  std::vector<std::wstring> m_sEnv;  std::vector<std::wstring> m_sArg;  unsigned long lLoop;  unsigned long lPos;  for (lLoop=0; lLoop<(unsigned long)iArgC; lLoop++) {   m_sArg.push_back(ArgV[lLoop]);  }  for (lLoop=0;;lLoop++) {   if (EnvP[lLoop] == NULL) break;   m_sEnv.push_back(EnvP[lLoop]);  }  for (lLoop=0;lLoop<m_sEnv.size();lLoop++) {   if ((lPos = m_sEnv.at(lLoop).find(L"jdk1")) != npos) { // *1    std::wcout << m_sEnv.at(lLoop) << std::endl;   }  }  return 0; } <-----ソース end-------> *1 で error C2065: 'npos' : 定義されていない識別子です。 「std::npos」も試したけどだめだった。 >>以下MSDNより >>basic_string::npos >>static const size_type npos = -1; >>この定数は、size_type 型として表現できる最大の値です。 >>max_size() よりも大きいことが保証されるため、 >>非常に大きな値または特殊なコードとして使用できます。

  • STL mapからの要素の削除

    mapより特定の値を持つ要素を削除したいのですが、上手くいきません。 下のようなコードで実現しようとしたのですが、eraseを呼んだ次のループでもう一度eraseを呼んで実行時エラーとなってしまうようです。 erase後のイテレータが指す値が悪いのではないかとは思うのですが、実際に何が悪いのかご存知の方がいらっしゃればアドバイスをお願いいたします。 string s[20]; char c='a'; map<string,bool> m; //mapへの要素の挿入 for(int j=0;j<20;j++){ s[j]=string(&c); c++; if(j%10==0) m[s[j]]=true; else m[s[j]]=false; } map<string,bool>::iterator i; //削除処理 for(i=m.begin();i!=m.end();i++){ if(i->second){ m.erase(i); } }

  • Perl のソート関数

     Perl を使い始めて数年になり、雑誌の隅っこに載る程度のフリーソフトなら作るようにもなりましたが、未だにソート関数の内部構造がさっぱり分かりません(^_^;  Perl の解説本も数冊、ホームページに至っては十数ほども有名と言われているところを回ってみましたが、ほとんどの Perl ユーザーがソート関数の使い方を丸覚えにしているようで、的を得ない解説しか載ってません。  そこで質問ですが、$a と $b には、いったい「何が」「どういうタイミングで」入ってきているのでしょうか?(配列の値が比較されるときに呼び出される、ということは分かりますが)  当たり前に考えれば、ソート関数というものは全てをユーザーに任せて関数を書かせるか、でなければフルオートで全てやってくれるソート関数を用意するか、どちらか1方しかないはずです。  なのに、Perl のソート関数は途中部分だけユーザーに書かせるという器用なことをやってます。  これはいったいどういう構造になっているのでしょう?

    • ベストアンサー
    • Perl
  • VBA FIND時のIFの使い方について

    VBA素人です。教えてください。 添付シートのようなデータがあるとします。 ユーザーフォームにテキストボックスを作成し、 (1)シート内の型式を型式BOXに手入力で入れる (2)良品数を手入力で入れる (3)日付を手入力で入れる(初期設定はDateをかえす) (1)~(3)を入力し、入力コマンドボタンで型式と日付がFINDするセルに 良品数を入れるコードを下記作成しました。 シート内に対象の型式、日付があれば、うまく作動するのですが、 型式、日付両方が無い場合、もしくはどちらか片方が無い場合は、 うまく作動しません。 おそらく型式FIND~IF、日付FIND~IFの使い方が悪いと思います。 型式がシート内に無ければ、型式エラーとしマクロを抜ける。 型式があり、日付が無ければ、日付エラーでマクロを抜けるコードを教えてください。 なお、型式を手入力で入れていますが、シート内の("B:B")セルを選択すると自動で型式テキストボックスに入れる方法もご教示下さい。 Private Sub UserForm_Initialize() 型式BOX = ""'テキストボックス 良品BOX = ""'テキストボックス 日付BOX = Date'テキストボックス 型式BOX.SetFocus End Sub Private Sub 入力_Click() Application.ScreenUpdating = False Application.EnableEvents = False If Len(型式BOX.Value) = 0 Then MsgBox "型式が未選定です" Cancel = True ElseIf Len(良品BOX.Value) = 0 Then MsgBox "良品が未入力です" Cancel = True ElseIf Len(日付BOX.Value) = 0 Then MsgBox "日付が未入力です" Cancel = True Else Dim a As Variant a = 型式BOX.Value Dim b As Date b = 日付BOX.Value On Error Resume Next Columns("B:B").Select ActiveSheet.Cells.Find(a, , , xlWhole, xlByRows, xlNext, False).Select X = ActiveCell.Row If Err = 91 Then MsgBox (prompt) & a & "の型式はありません", _ (vbOKOnly + vbExclamation), ("型式検索結果") Err.Clear End If On Error Resume Next Rows("1:1").Select ActiveSheet.Cells.Find(b, , , xlWhole, xlByColumns, xlNext, False).Select Y = ActiveCell.Column If Err = 91 Then MsgBox (prompt) & b & "の日付はありません", _ (vbOKOnly + vbExclamation), ("日付検索結果") Err.Clear   End If Cells(X, Y) = 良品BOX.Value End If End Sub

  • エクセルのソート順がおかしい

    エクセルのソート順がおかしい B4セルから縦方向に以下のデータを降順にオプションでコード順にソートする。 磐田 川崎 G大阪 C大阪 の順になる。 各要素間の値の比較する関数をVBAで作成して比較すると 川崎 < G大阪 となり、大小関係がおかしくなる。 上記以外の比較は下記のとおり正しい。 磐田 > 川崎 G大阪 > C大阪 各要素間の値の比較する関数は以下である。 Option Explicit Function compare(str1 As String, str2 As String) As String ' 大小関係を検査する If str1 > str2 Then compare = str1 & " greater than " & str2 ElseIf str1 = str2 Then compare = str1 & " Equal to " & str2 Else compare = str1 & " smaller than " & str2 End If End Function 実際のプログラムは「2分木探索」を使用しているので,大小関係が大切である。 これはどうすればソートがコード(ユニコード)順になるのか、教えて下さい。 なおエクセルは2000を使用している。

  • perlで比較関数を使ったソートの仕方

    今、季節をソートするようなプログラムを考えています。 my @array = ('spring','fall','winter','summer'); my @sort = sort number(@array); sub number { if ($a < $b) { return -1; } elsif ($a == $b) { return 0; } elsif ($a > $b) { return 1; } } 実行結果:spring ,summer ,fall ,winter 比較関数を使用して、「春・夏・秋・冬」とソートできるようにしたいです。上のプログラムはまだ途中なんですが、この場合比較関数はどのように実装すればうまくソートできるんでしょうか?分かる方、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • マージソート

    マージソートの実行時間を測定するプログラムを書いています。 コンパイルの時にはエラーが出ないのですが、実行するとコマンドプロンプトが強制終了されます。 どこが悪いか、どう直せばいいのか指摘していただけないでしょうか? よろしくお願いします。 ~qtime.c~ //マージソート実行用プログラム //bcc32 mtime.c merge.c m1.c sfmt.c #include <stdio.h> #include <stdlib.h> #include <time.h> #include "sfmt.h" #define MAX 5000 void merge_sort(int a[], int start, int end); main() { int i , x[MAX] , n; time_t start , end ; int sn; printf("適当な数字の入力 : "); scanf("%d", sn); init_gen_rand(sn); for(i=0; i<MAX; i++) x[i]= (gen_rand32()% MAX);; n=MAX; start = clock(); //測定対象プログラム merge_sort(x, 0, n-1); end = clock(); printf("sort\n"); for(i =0 ; i < n ; i++ ) if ( i == i/100*100) printf("%d\n" , x[i]); printf ("実行時間: %f sec\n" , (double)(end-start) /CLOCKS_PER_SEC); return 0; } ~merge.c~ int b[100]; void merge_array(int x[], int start, int end) { int mid, i, j, k; mid = (start + end) /2; i = start; j = mid + 1; for(k = start; k <= end; k++){ if(x[i] > x[j] && j <= end || i > mid){ b[k] = x[j]; j++; } else{ b[k] = x[i]; i++; } } for(k = start; k <= end; k++){ x[k] = b[k]; } } ~m1.c~ void merge_array(int x[], int start, int end); void merge_sort(int a[], int start, int end); void merge_sort(int a[], int start, int end) { int mid; if(start >= end) return; mid = (start + end) / 2; merge_sort(a, start, mid); merge_sort(a, mid + 1, end); merge_array(a, start, end); }

  • C++文字配列ソート関数を教えてください

    C++文字配列ソート関数を教えてください 配列に格納されている文字列をソートして完全一致するかを確認するロジックを作成したいのですが、上手くいきません。ネットなどでいろいろ調べたのですが>< 一応、以下に今の状態のソースを貼りました。 class StringSuzeLess { public; bool operator()( const std::string& Ihs, const std::string& rhs ) const { retrun ihs.size() < rhs.size(); } } int main() { // 文字列格納変数 chra str1[10][5+1]; char str2[10][5+1]; // 初期化 memset(str1, 0x00, sizeof(str1)); memset(str2, 0x00, sizeof(str2)); // 文字列設定 strcpy(str1[0], "AAAAA"); strcpy(str1[1], "BBBBB"); strcpy(str1[2], "CCCCC"); strcpy(str2[0], "CCCCC"); strcpy(str2[1], "BBBBB"); strcpy(str2[2], "AAAAA"); std::vector< std::string > vsmozi1; std::vector< std::string > vsmozi2; // ベクタに文字列設定 for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++) { vsmozi1.push_back( std::string( str1[LoopCnt] ) ); } for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++) { vsmozi2.push_back( std::string( str2[LoopCnt] ) ); } // ソート std::stable_sort( vsmozi1.begin(), vsmozi1.end(), StringSuzeLess()); std::stable_sort( vsmozi2.begin(), vsmozi2.end(), StringSuzeLess()); // ソート後の先頭から取得 for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++) { // 不一致の場合 if(vsmozi1[LoopCnt] != vsmozi2[LoopCnt]) { return -1; } } return 0; }

専門家に質問してみよう