0

我有如下的结构:分拣内存中对象的映射文件

struct XX 
{ 
    int x; 
    char szT[200]; 
    int y; 
} ; 

我具有存储几个这些XX目的,通过fwrite呼叫写入的文件。现在,当我使用mmap读取该文件作为存储mmaped文件,我使用如:

// 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 

因此,如果我有XX类型的N目的,我可以访问第一对象为:

XX *px = (XX*) p; 

而且,i-th对象我可以访问为px + i其中i <= N。 我可以使用std::sort对正在访问的内存映射文件的内容进行排序,因为px是第一条记录的指针,而px+i指向i-th记录。 我不喜欢存储px, px+1, px+2XX作为vector<XX*>指针向量,因为我可以直接从内存映射文件访问记录。 请建议。

+0

* _etc在XX指针向量中作为向量,因为我可以直接从内存映射文件访问记录。请建议._ * 感到困惑。如果你想使用std :: sort,你将不得不使用其中一个标准库数据结构,或者根据STL的规范创建你自己的数据结构。 – DavidBittner

+0

如果我使用一个向量作为v,那么我可以使用std :: sort(v.begin(),v.end(),comparexx),但是当我有内存映射文件时,如何使用自定义比较函数进行X比较? –

+0

没错。我看到了什么问题。使用lamda。如@Basile Starynkevitch所述,std :: sort函数可选地使用std ::函数来显示如何对信息进行排序。 – DavidBittner

回答

3

documentation of std::sort

下完全编译。它用排序一个奇特的拉姆达原始阵列(比较数字的平方)

#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抽象及其应用程序将被优化编译器内联)。

+0

我可以问为什么它写成'const struct XX&'而不是'const XX&'? – Default

+0

由于问题的初始版本没有正确定义'struct XX'。固定 –

+0

啊。谢谢。我看到了问题和答案的编辑。如果你不介意 - 那么当你使用一个匿名结构时,你需要定义'struct'呢?我不知道这个规则。 – Default