0

私は以下のような構造を持っているに:ソートは、メモリマップドファイル

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

私はfwrite呼び出して書かれたこれらのXXオブジェクトのいくつかを格納するファイルを持っています。私はMMAPを使用してメモリmmapedファイルとしてファイルを読み込むときに、今、私はとして使用します。

XX *px = (XX*) p; 

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

私はタイプXXNオブジェクトを持っている場合はこのように、私は最初のオブジェクトにアクセスすることができます。

そしてi-thオブジェクトはpx + iとしてアクセスできます。i <= Nです。 std::sortを使用して、アクセスされるメモリマップファイルの内容を、最初のレコードのポインタであるpxと、i-thレコードを指すpx+iとしてソートすることができます。 px, px+1, px+2などをXXポインタのベクトルにvector<XX*>という名前で格納したくないのですが、メモリマップファイルから直接レコードにアクセスできるためです。 お勧めします。

+0

* _etcをベクトルポインタとしてXXポインタのベクトルに格納すると、メモリマップファイルからレコードに直接アクセスできます。 ._ * これに混乱してください。 std :: sortを使用する場合は、標準ライブラリデータ構造のいずれかを使用するか、STLの仕様で独自のデータ構造を作成する必要があります。 – DavidBittner

+0

ベクトルとしてを使用すると、std :: sort(v.begin()、v.end()、comparexx)を使用することがありますが、メモリマップされたファイルを持っている場合、 Xの比較のための関数? –

+0

私は問題が何であるかを見ます。ラムダを使用してください。 @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なので、それは素朴に閉じないでしょう;おそらくラムダ抽象化アプリケーションは最適化コンパイラによってインライン展開されます)。

+0

なぜconst const XX& 'の代わりに' const struct XX& 'と書かれているのですか? – Default

+0

質問の最初のバージョンで 'struct XX'が正しく定義されていなかったためです。固定 –

+0

ああ。ありがとう。私は質問とあなたの答えの両方の編集を見る。あなたが気にしないなら、 'struct 'も同様に定義する必要がある匿名の構造体を使用するのでしょうか?私はそのルールを知らなかった。 – Default