使用STL SORT对缓冲区进行排序

时间:2012-07-14 15:14:25

标签: sorting stl buffer

我正在尝试使用STL排序对缓冲区进行排序。现在,我使用qsort,但我读到stlsort具有更好的性能,因为内联“比较”功能。缓冲区具有大小为52的元素。例如,它有1024个大小为52的元素。这是我的代码的一部分。它运行良好,但我想使用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);
}

我可以用其他方式阅读文件吗?使用向量,迭代器?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

当然可以。 您可以定义一个名为(例如)MyRecordType的类型,它描述您排序的记录。 然后定义一个对两个MyRecordTypes进行排序的例程,并调用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