web-dev-qa-db-fra.com

Obtenir l'index de l'élément dans la carte C++

J'ai un std::map appelé myMap dans mon application C++ et je veux obtenir un élément en utilisant myMap.find(key) ou myMap[key]. Cependant, j'aimerais aussi obtenir l'index de cet élément sur la carte.

std::map<string, int> myMap;
// Populate myMap with a bunch of items...
myElement = myMap["myKey"];
// Now I need to get the index of myElement in myMap

Y a-t-il un moyen propre de le faire?

Je vous remercie.

20
SZH

Un std::map n'a pas vraiment d'index, mais un itérateur pour une paire clé/valeur. Cela ressemble à un index en ce sens qu'il représente une position de tri dans la collection mais qu'il n'est pas numérique. Pour obtenir l'itérateur d'une paire clé/valeur, utilisez la méthode find 

std::map<string, int>::iterator it = myMap.find("myKey");
8
JaredPar

Je suis venu ici pour chercher cette réponse mais j'ai trouvé cette fonction Distance prend 2 itérateurs et retourne un index

cout << distance(mymap.begin(),mymap.find("198765432"));

espérons que cela aide: D

48
Mahmoud Aladdin

Si votre carte est déjà corrigée (vous n'ajouterez/supprimerez aucune clé par la suite) et vous souhaitez en extraire un index. Vous pouvez faire ce qui suit:

Créez un tableau qui stocke les clés de votre carte entière. Et voilà, clés accessibles par index!

vector<int> keys;
for (pair<K,V> entry : yourMap) {
    keys.Push_back(entry.first);
}

Et c'est tout. Pour accéder à un index i de votre carte, utilisez yourMap[keys[i]]

L'avantage de cette méthode par rapport à la fonction distance est la complexité temporelle. C'est O(1) garanti.

3
off99555

Well - map conserve la clé et les données sous forme de paires Vous pouvez donc extraire les clés en séparant l’itérateur de la carte en paire ou directement dans son premier élément.

std::map<string, int> myMap;
std::map<string, int>::iterator it;

for(it=myMap.begin();it!=myMap.end();it++)
{
    std::cout<<it->first<<std::endl;
}
1
user2614242

La sémantique d'une carte n'inclut pas les index. Pour comprendre cela, vous pouvez noter que les cartes sont généralement implémentées sous forme d'arborescence. Par conséquent, les éléments qu’il contient n’ont pas d’indice (essayez de définir un index de manière naturelle pour un arbre).

0
Sylvain Lobry

Map est une structure de données clé-valeur qui contient en interne des données dans une arborescence. Il y a O(n) solution mentionnée ci-dessus . "Distance (mymap.begin (), mymap.find (" 198765432 "))" "ne vous apportera pas la réponse correcte . Pour vos besoins , vous devez créer votre propre structure de données de type arborescence de segments pour les opérations concurrentielles O log (n).

0
soul_departed

Il n’existe pas d’index dans une carte. Les cartes ne sont pas stockées (pas nécessairement, du moins; et en fait, elles ne figurent pas dans la plupart des implémentations) sous forme d'une séquence de "paires".

Quelle que soit l'implémentation, std :: map ne modélise pas un conteneur ayant un index.

En fonction de la raison pour laquelle vous posez cette question, l'index peut être un itérateur (comme suggéré par d'autres) ou la clé elle-même.

Cependant, cela semble étrange que vous ayez posé cette question. Si vous pouviez nous donner un peu plus de détails, nous serions probablement en mesure de vous indiquer une meilleure solution à votre problème.

0
Stefano Falasca