2010-08-22 24 views
0

J'ai un stl unordered_map et je voudrais stocker des références aux éléments dans cette carte. Je voudrais qu'il n'y ait pas de références en double. Je pensais pouvoir créer un ensemble d'itérateurs qui pointaient vers des éléments. Pour un je n'étais pas sûr qu'il reconnaîtrait, mais même ainsi j'ai eu de longues erreurs de modèle qui se résument à l'absence d'opérateur de comparaison < pour les itérateurs.Ensemble STL d'itérateurs de carte

J'ai ensuite essayé une compilation non ordonnée avec g ++ -std = C++ 0x mais j'ai obtenu des pages d'erreurs.

Comment puis-je atteindre cet objectif?

#include <set> 
#include <unordered_map> 
#include <unordered_set> 

int main() { 

    typedef std::unordered_map<int, float> umap; 
    umap my_map; 

    umap::const_iterator itr; 
    for (int i=0;i<10000000;i++) { 
    my_map[i] = float(i); 
    } 

umap::iterator my_it1 = my_map.find(43); 
umap::iterator my_it2 = my_map.find(44); 
umap::iterator my_it3 = my_map.find(44); 


std::unordered_set<umap::iterator> my_its; 
my_its.insert(my_it1); 
my_its.insert(my_it2); 
my_its.insert(my_it3); 

return 0; 
} 

Répondre

3

Puisque vous essayez de stocker les itérateurs dans un ensemble non ordonné, vous n'avez pas besoin d'un opérateur de comparaison, mais plutôt une fonction de hachage.

Je suppose, puisque chaque itérateur distinct pointera sur une clé distincte, vous pouvez utiliser la valeur de hachage de la clé pour hacher l'itérateur.

struct iterator_hash 
{ 
    size_t operator()(std::unordered_map<int, float>::const_iterator it) const 
    { 
     return std::hash<int>()(it->first); 
    } 
}; 

et instancier l'ensemble non ordonné que:

std::unordered_set<umap::iterator, iterator_hash> my_its; 

unordered_set exige également une fonction d'égalité, mais les itérateurs possèdent operator== devrait faire bien, aussi longtemps que tous les itérateurs appartiennent à la même unordered_map.

Attention avec l'invalidation de l'itérateur.

+0

Très bien compilé. Venir à y penser. Il y a beaucoup d'algorithmes d'ensemble utiles comme l'intersection que je peux utiliser directement et simplement avec un ensemble normal. Y a-t-il une fonction de comparaison arbitraire que je peux mettre en œuvre pour que je puisse les utiliser sans me préoccuper de la commande? – zenna