Existe-t-il un moyen de parcourir les clés, pas les paires d'une carte C ++?
Réponses
Trop de publicités?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.
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";
}
}
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 :-)]
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());