moyen efficace d’obtenir la clé de std :: map value

J’ai une carte comme ci-dessous:

std::map mapobj; mapobj["one"] = 1; mapobj["two"] = 2; mapobj["three"] =3 ; 

comment obtenir la clé quand l’entrée est une valeur

EX:

entrée: 1

sortie: une

Remarque: Dans mon cas, la valeur est unique.

Une cartographie un à un est en fait assez facile, le moyen le plus rapide de le faire est probablement de conserver deux cartes, une pour chaque direction. Cela devient plus compliqué si ce n’est pas un à un, car vous devrez fournir un moyen d’obtenir une collection de valeurs ou de clés plutôt qu’un seul. Heureusement, vous n’avez que l’exigence individuelle.

L’une de ces cartes est celle que vous avez maintenant, l’autre mappera les valeurs sur une clé donnée.

 std::map forwardmapobj; std::map reversemapobj; 

et ceux-ci seraient maintenus dans une classe de bidimap quelconque.

Chaque fois que vous insérez ou supprimez de votre bidimap , vous devez effectuer l’opération équivalente sur les deux cartes internes.

Par exemple, voici un pseudo-code. Il maintient les deux cartes et veille à ce qu’elles soient synchronisées pour toutes les opérations que vous avez qui changent les clés et les valeurs:

 class biDiMap: map forwardMap map reverseMap void add(ssortingng key, int val): if exists forwardMap[key]: throw exception 'duplicate key' if exists reverseMap[val]: throw exception 'duplicate value' forwardMapObj[key] = val reverseMapObj[val] = key void delKey(ssortingng key): if not exists forwardMap[key]: throw exception 'no such key' delete reverseMap[forwardMap[key]] delete forwardMap[key] void delVal(int val): if not exists reverseMap[val]: throw exception 'no such value' delete forwardMap[reverseMap[val]] delete reverseMap[val] int getValFor(ssortingng key): return forwardMap[key] ssortingng getKeyFor(int val): return reverseMap[val] 

Évidemment, il y a beaucoup d’ autres choses que vous pourriez append mais qui devraient constituer la base. Dans tous les cas, vous avez probablement assez de travail devant vous pour en faire une classe C ++ 🙂


Si vous ne voulez pas lancer votre propre solution, alors Boost en propose une très bonne que vous pouvez assez bien utiliser telle quelle. Boost.Bimap fournit une carte bidirectionnelle entièrement Boost.Bimap que vous devriez pouvoir utiliser avec un code minimal, tel que le programme complet suivant:

 #include  #include  #include  using std::ssortingng; using std::cout; using std::exception; using boost::bimap; int main() { typedef bimap SiMap; typedef SiMap::value_type SiEntry; SiMap bidi; bidi.insert(SiEntry("ninety-nine", 99)); int i = 0; for (ssortingng str: {"one", "two" , "three", "four", "five", "six"}) { bidi.insert(SiEntry(str, ++i)); } cout << "The number of entries is " << bidi.size() << "\n\n"; for (auto i = 1; i <= 7; i += 3) { try { cout << "Text for number " << i << " is " << bidi.right.at(i) << "\n"; } catch (exception &e) { cout << "Got exception looking up number " << i << ": " << e.what() << "\n"; } } cout << "\n"; for (auto str: {"five", "ninety-nine", "zero"}) { try { cout << "Number for text '" << str << "' is " << bidi.left.at(str) << "\n"; } catch (exception &e) { cout << "Got exception looking up text '" << str << "': " << e.what() << "\n"; } } cout << "\n"; return 0; } 

Il crée un mappage bidirectionnel entre la forme textuelle d'un nombre et la valeur intégrale, puis effectue quelques recherches (dans les deux sens) pour montrer que cela fonctionne:

 The number of ensortinges is 7 Text for number 1 is one Text for number 4 is four Got exception looking up number 7: bimap<>: invalid key Number for text 'five' is 5 Number for text 'ninety-nine' is 99 Got exception looking up text 'zero': bimap<>: invalid key 

Je remarque que cela a la balise “stdmap”, donc cela peut ne pas être approprié. Cependant Boost a boost::bimap<> qui vous permettra de faire ce que vous voulez: il permet une recherche par clé ou par valeur.

comment obtenir la clé quand l’entrée est une valeur

  1. Premièrement, rien ne garantit que la valeur est unique. Je me rends compte que vous dites que c’est unique. Pourtant, conceptuellement, il faut garder cela à l’esprit lorsque l’on examine le problème.

  2. Deuxièmement, std::map n’est pas sortingé par valeur. Par conséquent, l’algorithme le plus efficace pour rechercher une valeur sera O(N) en moyenne.

Essayez de renforcer Bimap. tout ce que vous essayez de faire peut simplement être fait par elle.

1 -> un 2 -> deux … un -> 1 deux -> 2 …

voici un lien où un exemple de travail est présent. ici