2
としてC++のstd::partial_sort
があります。 lsortは十分強力ではありません。tclの部分ソートコマンドはありますか?
としてC++のstd::partial_sort
があります。 lsortは十分強力ではありません。tclの部分ソートコマンドはありますか?
partial_sort
に相当するビルトインはありません。あなたの選択は、Tclで手で実装するか、あるいはあなたが得ようとしたどんな効率をも損なうでしょう。実際にpartial_sort
をインタープリタに公開する拡張機能を作成してください。それは実際には難しいことではありません。Tclの拡張はかなり簡単に書くことができます。ここではちょうどあなたが起動する必要がありますホイップしたコードのビット:
#include <algorithm>
#include "tcl.h"
using namespace std;
static int PartialSortCommand(ClientData dummy,
Tcl_Interp *interp,
int objc,
Tcl_Obj *CONST objv[]);
EXTERN int
Partialsort_Init(Tcl_Interp *interp)
{
if (Tcl_InitStubs(interp, "8.0", 0) == NULL) {
return TCL_ERROR;
}
if (Tcl_PkgProvide(interp, "partialsort", "1.0") != TCL_OK) {
return TCL_ERROR;
}
Tcl_CreateObjCommand(interp, "partialsort", PartialSortCommand,
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
return TCL_OK;
}
bool CompareObjs(Tcl_Obj *a, Tcl_Obj *b) {
int left, right;
Tcl_GetIntFromObj(0, a, &left);
Tcl_GetIntFromObj(0, b, &right);
return left < right;
}
int PartialSortCommand(
ClientData dummy,
Tcl_Interp *interp,
int objc,
Tcl_Obj *CONST objv[])
{
if (objc != 5) {
Tcl_WrongNumArgs(interp, 1, objv, "list start middle end");
return TCL_ERROR;
}
Tcl_Obj **objs;
int count;
if (Tcl_ListObjGetElements(interp, objv[1], &count, &objs) != TCL_OK) {
return TCL_ERROR;
}
int start, middle, end;
if (Tcl_GetIntFromObj(interp, objv[2], &start) != TCL_OK) {
return TCL_ERROR;
}
if (Tcl_GetIntFromObj(interp, objv[3], &middle) != TCL_OK) {
return TCL_ERROR;
}
if (Tcl_GetIntFromObj(interp, objv[4], &end) != TCL_OK) {
return TCL_ERROR;
}
partial_sort(&objs[start], &objs[middle], &objs[end], CompareObjs);
Tcl_SetObjResult(interp, Tcl_NewListObj(count, objs));
return TCL_OK;
}
もちろんこれは単なるラフカットです。整数リストのみを処理します。エラーチェックの方法ではあまり効果がありません。共有されたTcl_Obj構造体に関しては、少し奇妙です。しかし、うまくいけば、それはあなたが正しいディレクトリに行くようになるでしょう。
+1:Tclは実際には 'partial_sort'のように何もありません。 'Tcl_ListObjGetElements'から値の配列から新しい' Tcl_Obj'を作成し、*そのオブジェクトの配列の値を扱うように変更する場合、それは(ちょうど)コーシャになるでしょう。 –