最近更新したページ
2013-10-20
2013-09-29
2013-09-23
2012-01-07
2011-11-09
2011-10-23
2011-10-09
2011-10-01
2011-09-29
2011-09-03
2011-08-07
2011-08-02
2011-07-29
2011-07-10
2011-05-05
2011-05-04
2011-04-24
2011-04-13
2011-04-05
2011-03-26
2011-02-18
2011-02-15
2010-12-26
2010-12-07
2010-12-05
2010-11-23
2010-09-28
2010-09-23
2010-08-26
2010-08-22
2010-07-16
2010-01-17
2010-01-11
2009-10-04
2009-08-21
2009-08-13
2009-06-18
2009-06-01
2009-04-29
2009-02-16
2009-02-11
2009-02-03
2008-07-22
2008-07-21
2008-07-15
2008-07-14
2008-07-13
2008-07-12
2008-07-08
2008-07-05
2008-06-28
2008-06-17
2008-06-05
2008-06-02
2008-06-01
2008-05-29
2008-05-26
2008-05-21
2008-05-19
2008-05-18
2007-10-31
2007-10-27
2007-09-28
2007-09-23
2007-09-17
2007-09-16
2007-09-14
2007-09-11
2007-06-18
2007-04-15
2006-12-21
2006-11-30
2006-11-22
2006-08-17
2006-03-29
2006-03-28
2006-03-27

C/C++ STL sort


C/C++ ソート


STL algorithm sort


ソートテストで使用した関数サンプル

 ※このサンプルは、main_sort.cpp をメインとして分割(分割コンパイル)された一部。
 メイン、ヘッダー、共通関数等は、分割コンパイルの頁を参照。

sub_sort_std.cpp
//#include <iostream>
//#include <time.h>
//#include <string>
#include <vector>
#include <algorithm>
#include <functional>   // プレディケート less<Type>() greater<Type>()
using namespace std;

#include "main_sort.h"

// -----------------------------------------
// ソート関数
// -----------------------------------------

/*****************************
std::sort 1,2
*****************************/
void ssort1(vector < int > & v) {            // 参考:1.8120
// dsp_arr(&v[0], (int)v.size());
   // ----------------------------
   sort(v.begin(), v.end());                 // 昇順 less<int>()
// sort(v.begin(), v.end(), greater<int>()); // 降順 greater<int>()
   // ----------------------------
// dsp_arr(&v[0], (int)v.size());
}
void ssort2(vector < int > & v) {            // 参考:1.4420
// dsp_arr(&v[0], (int)v.size());
   // ----------------------------
   sort(v.begin(), v.end(), asc1_cmp);       // 昇順
// sort(v.begin(), v.end(), des1_cmp);       // 降順
   // ----------------------------
// dsp_arr(&v[0], (int)v.size());
}
void ssort3(vector < int > & v) {            // 参考:1.5730
// dsp_arr(&v[0], (int)v.size());
   // ----------------------------
   sort(v.begin(), v.end(), asc2_cmp());     // 昇順
// sort(v.begin(), v.end(), des2_cmp());     // 降順
   // ----------------------------
// dsp_arr(&v[0], (int)v.size());
}
※アルゴリズムは qsort 非安定ソート。処理速度もそれほど速い訳ではない様だ。


▲上へ [ 編集 ]

algorithm std::sort()

 C++ STL 利用で昇順、逆順程度の簡単なソートなら容易に利用可能。
 但し「構造体メンバで並べ替え」などをしようとすると突如ハイレベルになる。
 (operator 何チャラの習得も必要:現在意味不明でちんぷんかんぷん!)
 また、何気なく無視していた「テンプレート:template」の知識も必要。
 (template は、突っ込まなければ案外判り易い)

 sort() は、STL #include <algorithm> で利用可能。Win32 でも問題なく(当然だが...)利用可能。
 <vector> などの STL 専用と思い込んでたがそうではないらしく、普通の配列でも利用できる。

関数プロトタイプ(想像版)
※明確に判らないので、想像(テキトー)です。
???? sort(配列先頭アドレス, 配列の終了(最終)アドレス, 並び順);
※内容非保証!

sample: Win32 Console Application(project) に作成した sort.cpp サンプル
// Win32 Sort.cpp
#include <iostream>
#include <algorithm> // 汎用アルゴリズム利用
void main(void) {
    int arrTbl[50] = {126,123,130,…};
    sort(arrTbl, arrTbl+50);   // 第2パラメータまではルンルン気分で利用可♪
}
// qsort に比べ非常にシンプル。
※project が win32 でも当然動作する。(C++標準テンプレートライブラリ::STL)
※list 出力では、なにやら bug があるらしい。(多分、同値の出現順が不規則?)
※上記追記。<list> に対して std::sort は使えない。std::sort はランダムアクセスイテレータ(要するにランダムアクセス可能なデータ構造)を使用する。<list> は基本的に ランダムアクセスが出来ないデータ構造。
※<list> で sort をする場合 <list> のメンバ関数の sort を明示的に使用する。

sample 1-2
〜 省略 〜
#include <algorithm>                // 追加
// using namespace std;             // 必要に応じ追加

void main() {
   const int arr_elements = 10;     // 配列要素数
   double arr_tbl[arr_elements];    // 配列の作成

   // □テストデータ代入(関数呼出)
   testArrData(arr_tbl, arr_elements);
   // □配列要素を表示
   std::cout << "ソート前:";
   for (int i=0; i<arr_elements; i++) { 
      printf("%3.0f ", arr_tbl[i]);
   }
   std::cout << std::endl;
   // ■ソート
   std::sort(arr_tbl, arr_tbl+arr_elements);
   // ■ソート済み配列要素を表示
   std::cout << "ソート後:";
   for (int i=0; i<arr_elements; i++) { 
      printf("%3.0f ", arr_tbl[i]);
   }
   std::cout << std::endl;

}
〜 省略 〜
   srand((unsigned)(time(NULL)+getpid())); // 有効
   // srand(1);                            // 無効
〜 省略 〜
※vector 等でなくとも並べ替えが可能。

表示サンプル
ソート前: 11  87   8  30  95  42  90  26  56  10
ソート後:  8  10  11  26  30  42  56  87  90  95
続行するには何かキーを押してください . . .
※非常に簡単。


▲上へ [ 編集 ]


リンク


内部リンク


外部リンク


  • 現在ありません

▲上へ
2008年07月21日(月) 15:30:13 Modified by cafeboy1




スマートフォン版で見る