177 votes

Itérer les clés dans une carte C ++

Existe-t-il un moyen de parcourir les clés, pas les paires d'une carte C ++?

139voto

aJ. Points 17014

la carte est un conteneur associatif. Par conséquent, l'itérateur est une paire de clés, val. SI vous n'avez besoin que de clés, vous pouvez ignorer la partie valeur de la paire.

 for(std::map<key,Val>::iterator iter = myMap.begin(); iter != myMap.end(); ++iter)
{
Key k =  iter->first;
//ignore value
//Value v = iter->second;
}
 

EDIT:: Si vous souhaitez n’exposer que les clés à l’extérieur, vous pouvez convertir la carte en vecteur ou en clés et les exposer.

119voto

John H. Points 143

Avec C ++ 11, la syntaxe d'itération est simple. Vous parcourez toujours des paires, mais accéder à la clé est facile.

 #include <iostream>
#include <map>

main()
{
    std::map<std::string, int> myMap;

    myMap["one"] = 1;
    myMap["two"] = 2;
    myMap["three"] = 3;

    for ( const auto &myPair : myMap ) {
        std::cout << myPair.first << "\n";
    }
}
 

75voto

Steve Jessop Points 166970

Si vous avez vraiment besoin de masquer la valeur que le "vrai" itérateur retours (par exemple parce que vous voulez utiliser votre clé itérateur avec des algorithmes standard, de sorte qu'ils opèrent sur les touches au lieu de la paire), jetez un coup d'œil à Stimuler la transform_iterator.

[Astuce: lorsque vous cherchez à Stimuler la documentation pour une nouvelle classe, lisez la section "exemples" à la fin de la première. Vous disposez ensuite d'un sportif de chance de trouver ce que sur la terre, le reste est d'en parler :-)]

61voto

Ian Points 216

Sans boost

Vous pouvez le faire en développant simplement l’itérateur STL pour cette carte. Par exemple, un mappage de chaînes à ints:

 #include <map>
typedef map<string, int> ScoreMap;
typedef ScoreMap::iterator ScoreMapIterator;

class key_iterator : public ScoreMapIterator
{
  public:
    key_iterator() : ScoreMapIterator() {};
    key_iterator(ScoreMapIterator s) : ScoreMapIterator(s) {};
    string* operator->() { return (string* const)&(ScoreMapIterator::operator->()->first); }
    string operator*() { return ScoreMapIterator::operator*().first; }
};
 

Vous pouvez également effectuer cette extension dans un modèle, pour une solution plus générale.

Vous utilisez votre itérateur exactement comme vous utiliseriez un itérateur de liste, sauf que vous effectuez une itération sur les cartes begin() et end() la carte.

 ScoreMap m;
m["jim"] = 1000;
m["sally"] = 2000;

for (key_iterator s = m.begin(); s != m.end(); ++s)
    printf("\n key %s", s->c_str());
 

14voto

rodrigob Points 1084

Vous recherchez des map_keys , vous pouvez écrire des choses comme

 BOOST_FOREACH(const key_t key, the_map | boost::adaptors::map_keys)
{
  // do something with key
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X