0

J'ai une structure comme ci-dessous:tri des objets dans la mémoire mappée fichier

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

J'ai un fichier qui stocke plusieurs de ces objets XX, écrits par fwrite appel. Maintenant, quand je lis le fichier en tant que fichier mmaped mémoire à l'aide mmap, je l'utilise comme:

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

Ainsi, si j'ai N objets de type XX, j'accéder au premier objet comme:

XX *px = (XX*) p; 

Et, i-th objet que je peux accéder comme px + ii <= N. Puis-je utiliser std::sort pour trier le contenu d'un fichier mappé en mémoire en cours d'accès comme px étant le pointeur du premier enregistrement, et px+i pointant vers l'enregistrement i-th. Je n'aime pas stocker px, px+1, px+2 etc. dans un vecteur de XX pointeurs comme vector<XX*>, que je peux accéder aux enregistrements directement à partir du fichier mappé en mémoire. Veuillez nous suggérer.

+0

* _etc dans un vecteur de pointeurs XX que le vecteur , car je peux accéder aux enregistrements directement à partir du fichier mappé en mémoire. S'il vous plaît suggérer ._ * Confus par cela. Si vous voulez utiliser std :: sort, vous devrez utiliser l'une des structures de données de la bibliothèque standard, ou créer la vôtre par la spécification de la STL. – DavidBittner

+0

Si j'utilise un vecteur comme v, alors je peux utiliser std :: sort (v.begin(), v.end(), comparexx), mais quand j'ai un fichier mappé en mémoire, comment trier en utilisant comparer comparer fonction pour la comparaison X? –

+0

Droite. Je vois quel est le problème. Utilisez un lamda. Comme indiqué ci-dessous par @Basile Starynkevitch, la fonction std :: sort prend en option une fonction std :: pour montrer comment vous souhaitez trier les informations. – DavidBittner

Répondre

3

Lire documentation of std::sort

qui suit compile proprement. Il trie un tableau avec une première lambda particulière (comparaison des carrés des nombres)

#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; }); 
}  

Vous devriez être en mesure d'adapter ce à votre situation:

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; }); 
} 

En savoir plus sur lambda expressions in C++. [=] est une notation capture-list par valeur (en fait par copie) (pour toutes les variables fermées, théoriquement la seule étant strcmp que le compilateur est susceptible d'optimiser - donc ne le ferme pas naïvement, probablement l'abstraction lambda et son l'application serait incorporée par un compilateur d'optimisation).

+0

Puis-je demander pourquoi il est écrit 'const struct XX &' au lieu de 'const XX &'? – Default

+0

Parce qu'une version initiale de la question n'a pas défini 'struct XX' correctement. Fixe –

+0

Ah. Merci. Je vois les modifications de la question et de votre réponse. Si cela ne vous dérange pas - c'est donc quand on utilise une structure anonyme que vous devez également définir 'struct'? Je ne connaissais pas cette règle. – Default