0

STL ソートを使用してバッファをソートしようとしています。今、私はqsortを使用していますが、インラインの「比較」機能により、stlsortのパフォーマンスが向上していることを読みました。バッファーにはサイズ 52 の要素があります。たとえば、サイズ 52 の要素が 1024 個あります。これが私のコードの一部です。うまくいっていますが、STLソートを使いたいです。固定長ファイルをソートしています。各固定長ファイルにはレコード サイズがあるため、ユーザーはレコード サイズを通知する必要があります。以下の例では、52 を入力します。

HANDLE hInFile;
char * sharedBuffer;
int recordSize = 52;
sharedBuffer = new char [totalMemory];
hInFile = CreateFile(LPCSTR(filePathIn), GENERIC_READ, 0, NULL, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, NULL); 
ReadFile(hInFile, sharedBuffer, totalMemory, &dwBytesRead, NULL);
CloseHandle(hInFile);

qsort(sharedBuffer, dwBytesRead/recordSize, recordSize, compare); //sort using qsort but i want to use the slt sort

WriteFile(hOutFile, sharedBuffer, dwBytesRead, &dwBytesRead, NULL);
CloseHandle(hOutFile); //write the sorted buffer to disk

int compare (const void * a, const void * b)
{
return memcmp((char *)a, (char *)b, recordSize);
}

他の方法でファイルを読み取ることはできますか? ベクトル、イテレータを使用しますか?

助けてくれてありがとう!

4

1 に答える 1

0

できますよ。並べ替えるレコードを記述する (たとえば) MyRecordType というタイプを定義します。次に、2 つの MyRecordType を並べ替えるルーチンを定義し、配列と比較関数を渡して std::sort を呼び出します。

サンプルコード (未テスト):

typedef struct {
    char foo[52];
} MyRecordType;

bool comp ( const MyRecordType &lhs, const MyRecordType &rhs ) {
    return lhs.foo[0] < rhs.foo[0]; // some ordering criteria
}

// figure out how many records you are going to process
MyRecordType * sharedBuffer = new MyRecordType [ count ];
// read into sharedBuffer as before (though one at a time would be better, due to packing concerns)
std::sort ( sharedBuffer, sharedBuffer + count, comp );
// write back out
于 2012-07-14T23:27:14.980 に答える