簡體   English   中英

內存映射文件中對象的排序

[英]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*> ,因為我可以直接從內存映射文件訪問記錄。 請提出建議。

閱讀std::sort文檔

以下內容可以干凈地編譯。 它使用特殊的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM