Sort関数の働き・役割
Sort関数は、ベクトルや行列のデータをその場で並べ替えるために使用されます。この関数は、デフォルトでは昇順に並べ替えを行いますが、カスタムの比較関数を指定することで、独自の条件に基づいた並べ替えも可能です。
ベクトルや行列の内容を一時的にコピーすることなく、直接その場で並べ替えを適用するため、効率的な処理を実現できます。また、行列の場合には、並べ替えの軸を指定することで、行単位または列単位での操作が行えます。
Sort関数の引数について
vector::Sort
void vector::Sort(
func_name compare_func=NULL, // 比較関数
T context // カスタム並び替え関数のパラメータ
);
- compare_func
並べ替えに使用する比較関数を指定します。指定しない場合、デフォルトの昇順で並べ替えが実行されます。比較関数には以下の形式の関数を指定できます。 - context
カスタム比較関数に渡す追加のオプションパラメータです。例えば、並べ替えの基準を変更したい場合に使用します。
matrix::Sort (比較関数のみ指定)
void matrix::Sort(
func_name compare_func=NULL // 比較関数
T context // カスタム並び替え関数のパラメータ
);
matrix::Sort (軸指定あり)
void matrix::Sort(
const int axis, // 並べ替えの軸
func_name compare_func=NULL // 比較関数
T context // カスタム並び替え関数のパラメータ
);
- axis
並べ替えの軸を指定します。- 0: 水平方向(行を基準に並べ替え)。
- 1: 垂直方向(列を基準に並べ替え)。
- compare_func
並べ替えに使用する比較関数を指定します。仕様は vector::Sortと同様です。 - context
カスタム比較関数に渡す追加パラメータです。
Sort関数の戻り値について
Sort関数は値を返しません。この関数を実行すると、指定したベクトルや行列のデータがその場で並べ替えられます。つまり、Sort関数は元のデータに直接変更を加える形式で動作します。
並べ替えの結果を新しいデータ構造として取得するのではなく、呼び出し元で使用している行列やベクトルの内容が、関数の実行後に並べ替えられた状態になります。そのため、操作後のデータを使用する際には、関数呼び出しが完了した時点で変更が反映されていることを考慮する必要があります。
Sort関数を使ったサンプルコード
一応公式リファレンスには下記のようなサンプルコードが掲載されていますが・・・
//+------------------------------------------------------------------+
//| 並び替え関数 |
//+------------------------------------------------------------------+
int MyDoubleComparator(double x1,double x2,int sort_mode=0)
{
int res=x1<x2 ? -1 : (x1>x2 ? 1 : 0);
return(sort_mode==0 ? res : -res);
}
//+------------------------------------------------------------------+
//| スクリプトを開始する関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- ベクトルに書き入れる
vector v(100);
//--- 昇順で並べ替える
v.Sort(MyDoubleComparator); // an additional parameter with the default value '0' is used here
Print(v);
// 降順で並べ替える
v.Sort(MyDoubleComparator,1); // ここでは、追加のパラメータ「1」がユーザーによって明示的に指定されている
Print(v);
}
vector型のインスタンスからは呼び出せないようになっています。(=「vector型インスタンスのメンバには実装されていない」というコンパイルエラーが出てしまう)
ArgSort関数でも同じような問題が発生していますが、ArgSort関数は少なくとも多次元配列からは
呼び出す事が出来て挙動を確認することはできました。一方Sort関数からも呼び出せず、リファレンス解説にあるような挙動は現状実行しては確認できておりません。
※どなたか詳しい方がいたらご教授いただければ幸いです。