我的结构如下:
struct XX
{
int x;
char szT[200];
int y;
} ;
我有一个文件存储了几个XX
个对象,通过fwrite
调用写入。现在,当我使用mmap将文件读作内存mmaped文件时,我使用as:
// sz = size of the file in bytes
// fd = file descriptor of the file opened through fopen in O_RDWR mode
char *p = (char *) mmap(0,sz,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
unsigned int N = (sz / sizeof(XX)); // number of objects
因此,如果我有N
XX
类型的对象,我可以访问第一个对象:
XX *px = (XX*) p;
并且i-th
对象我可以px + i
访问i <= N
。
我可以使用std::sort
对正在访问的内存映射文件的内容进行排序,因为px是第一条记录的指针,而px+i
指向i-th
条记录。
我不想将px, px+1, px+2
等存储在XX
指针的向量vector<XX*>
中,因为我可以直接从内存映射文件中访问记录。
请建议。
答案 0 :(得分:3)
以下编译干净利落。它使用特殊的lambda(比较数字的平方)对原始数组进行排序
#include <algorithm>
#include <functional>
void sort_array(int *p, size_t n) {
std::sort(p, p+n, [=](int x, int y) { return x*x < y*y; });
}
你应该能够适应你的情况:
void sort_xx (XX*p, size_t n) {
std::sort(p, p+n, [=](const XX& x, const XX& y)
{ return strcmp(x.szT, y.szT)<0; });
}
详细了解lambda expressions in C++。 [=]
是按值(实际上是通过副本)表示的捕获列表(对于所有已关闭的变量,理论上这是编译器可能优化的唯一一个strcmp
- 因此不会关闭天真地;可能lambda抽象及其应用程序将由优化编译器内联。)