2010-07-13 58 views
5

J'ai d'abord commencé en utilisant un std::multimap pour stocker de nombreuses valeurs avec la même clé, mais j'ai ensuite découvert qu'il ne conserve pas l'ordre d'insertion parmi les valeurs avec la même clé. This answer prétend qu'il peut être fait avec boost::multi_index::multi_index_container, mais ne donne aucun exemple. En regardant à travers les documents, il n'y a pas d'exemples de cette utilisation, et je ne peux pas faire la tête ou la queue de la façon dont vous êtes censé utiliser cette chose. Je m'attends à une documentation médiocre de la part des bibliothèques de boost les moins utilisées, mais cela prend le gâteau. Quelqu'un peut-il me diriger vers un tutoriel ou un exemple qui montre qu'il est utilisé comme je le veux, ou peut-être même fournir un exemple eux-mêmes?en utilisant boost multi_index_container pour conserver l'ordre d'insertion

+0

Avez-vous besoin que ce soit une multi-carte? – doublep

+0

oui, je le fais. J'ai plusieurs valeurs avec la même clé. – rmeador

Répondre

6

Vous pouvez réaliser ceci en utilisant boost::multi_index avec deux indices: ordered_non_unique (qui permet des valeurs avec la même clé) et random_access (qui gardera l'ordre d'insertion).

struct some { 
    long key; 
    int data; 
    int more_data; 
    // etc. 
}; 

typedef multi_index_container< 
    some, 
    indexed_by<  
    random_access<>, // keep insertion order 
    ordered_non_unique< member<some, long, &some::key> > 
    > 
> some_mic_t; 
+1

En supportant cette réponse, à partir de la documentation du boost: ** Les indices d'accès aléatoire sont des séquences d'ordre libre avec un accès positionnel à temps constant et des itérateurs à accès aléatoire. Les éléments d'un index à accès aléatoire sont triés par défaut en fonction de leur ordre d'insertion ** –

0

Que diriez-vous d'un

map<int, vector<string> > 

ou

map<int, list<string> > 

@Kirill: Bonne réponse. Je suspecte que random_access de Boost peut être assez lent, car il forcera toutes les chaînes pour toutes les clefs à être maintenues dans une structure contiguë simple. Alors que le questionneur veut simplement que l'ordre soit préservé dans l'ensemble des valeurs cartographiées de chaque clé.

+0

'random_access' est un index supplémentaire. Vous utilisez 'ordered_non_unique' pour la recherche, puis' random_access' pour l'itération de la gamme résultante. Ce n'est pas lent. –

+0

(J'ai beaucoup utilisé ind_multi, mais pas random_index, donc je ne suis pas sûr de rien de tout ça) @Kirill: Deux points: @rmeador veut pouvoir "préserver l'ordre d'insertion parmi les valeurs avec la même clé ". Étant donné une seule clé, comment l'indice aléatoire entier peut-il être utilisé pour atteindre rapidement cet objectif? Je soupçonne que la structure que j'ai suggérée pourrait être la seule façon de le faire. Je voulais dire que l'insertion de nouveaux éléments peut être plus lente que nécessaire, car l'index aléatoire entier est potentiellement obsolète. –

+1

@Kirill: Pour clarifier, une fois que ordered_non_unique a identifié une plage de valeurs (non triées) correspondant à une seule clé, comment utilisez-vous (rapidement) random_access pour trier cet ensemble de valeurs? Cet ensemble de valeurs peut être réparti uniformément dans un grand index random_access. L'itération dans la plage random_access ne conserve pas les clés dans l'ordre. –