[英]sorting of objects in memory mapped file
我的结构如下:
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
因此,如果我有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*>
,因为我可以直接从内存映射文件访问记录。 请提出建议。
以下内容可以干净地编译。 它使用特殊的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; });
}
阅读有关C ++中的lambda表达式的更多信息。 [=]
是按值表示的捕获列表(实际上是按拷贝表示)(对于所有封闭变量,理论上唯一的一个是编译器可能会优化的strcmp
,因此不会天真地将其关闭;可能是lambda抽象并且其应用将由优化的编译器内联)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.