2010-11-04 8 views
1

J'ai besoin d'une structure de données pouvant être triée automatiquement en fonction d'une structure.Structure de données STL avec tri

struct{ 
    int key; 
    int comparisonValue(size of the vector); 
} 

J'ai besoin sous la forme suivante:

datastructure<struct, vector<int>> 

Lorsque la structure de données sont triées automatiquement en fonction de la comparisonValue et basée sur la valeur minimale de la valeur de comparaison, je voudrais obtenir le vecteur et ajouter des données à ce sujet.

Quelle structure de données pourrais-je utiliser? Puis-je utiliser la carte et y a-t-il un trieur personnalisé pour la carte?

Que faire si j'ai besoin de modifier la clé, dans ce cas la valeur de comparaison et de garder l'ordre trié?

Merci

Répondre

10

std::map de la STL.

Par défaut, cette fonction trie les valeurs clés en les comparant à l'aide de std::less<Key>, qui appelle par défaut operator< sur les valeurs de clé. Par conséquent, vous pouvez définir une surcharge de operator< pour votre type de struct ::

bool operator<(const Key &a, const Key &b) 
{ 
    return (a.someField < b.someField); 
} 
+0

Merci pour la réponse. J'ai implémenté la méthode. Il semble que make_pair ait besoin de surcharger l'opérateur ==. Pourquoi est-ce vrai? – Leslieg

+0

/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../include/c++/4.5.1/bits/stl_function.h:203:23: erreur: aucune correspondance pour l'opérateur == â dans ___ __ == __yâ /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../include/c++/4.5.1/ bits/random.h: 3360: 3: note: le candidat est: bool std :: opérateur == (const std :: bernoulli_distribution &, const std :: bernoulli_distribution &) – Leslieg

+0

@Leslieg: Cela ne devrait pas être le cas. Pouvez-vous poster le code que vous utilisez, avec l'erreur du compilateur? –

1

» ... et en fonction de la valeur minimale de la valeur de comparaison, je voudrais obtenir le vecteur et ajouter des données à ce "

Si vous souhaitez obtenir le plus petit élément de toute la collection, vous pouvez préférer un std::priority_queue, en supposant que vous ne mettez à jour que le plus petit élément.

Sinon, c'est probablement ce dont vous avez besoin, comme le suggère Oli Charlesworth. Vous devriez probablement jeter un oeil à map méthodes lower_bound() et upper_bound().

Vous devez également savoir que les conteneurs STL conservent copies des objets. Par conséquent, si vous souhaitez que vos modifications soient répercutées ailleurs, vous devez stocker des pointeurs sur les objets. Ensuite, vous utiliserez un Functor séparé pour comparer les pointeurs en fonction de ce qu'ils pointent.

+0

Que puis-je faire si j'ai besoin de modifier la clé, dans ce cas la comparaisonValue et toujours garder l'ordre trié? – Leslieg

+0

@Leslieg: Dans le cas de 'std :: map', au moins, vous devez supprimer l'élément d'origine et en insérer un nouveau. –