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