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'를 만들기 위해 그것을 변경하고 * 그 * 객체의 값 배열에 대해 작업한다면, 그것도 (단지) 정결하게 될 것입니다. –