[英]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.