C'est l'une des façons possibles de sortir:
struct RetrieveKey
{
template <typename T>
typename T::first_type operator()(T keyValuePair) const
{
return keyValuePair.first;
}
};
map<int, int> m;
vector<int> keys;
// Retrieve all keys
transform(m.begin(), m.end(), back_inserter(keys), RetrieveKey());
// Dump all keys
copy(keys.begin(), keys.end(), ostream_iterator<int>(cout, "\n"));
Bien sûr, nous pouvons également récupérer toutes les valeurs de la carte en définissant un autre foncteur RetrieveValues .
Existe-t-il un autre moyen d'y parvenir facilement? (Je me demande toujours pourquoi std :: map n'inclut pas de fonction membre pour nous.)
c++
dictionary
stl
stdmap
Owen
la source
la source
keys.reserve(m.size());
.Réponses:
Bien que votre solution devrait fonctionner, elle peut être difficile à lire selon le niveau de compétence de vos collègues programmeurs. De plus, il éloigne les fonctionnalités du site d'appel. Ce qui peut rendre la maintenance un peu plus difficile.
Je ne sais pas si votre objectif est de mettre les clés dans un vecteur ou de les imprimer sur cout donc je fais les deux. Vous pouvez essayer quelque chose comme ceci:
Ou encore plus simple, si vous utilisez Boost:
Personnellement, j'aime la version BOOST_FOREACH car il y a moins de frappe et elle est très explicite sur ce qu'elle fait.
la source
BOOST_FOREACH
? Le code que vous proposez ici est totalement fauxv.reserve(m.size())
pour éviter de redimensionner le vecteur lors du transfert.la source
it = ...begin(); it != ...end
. Le plus sympa serait bien sûr std :: map ayant une méthode keys () retournant ce vecteur ...answered Mar 13 '12 at 22:33
, c'est-à-dire plusieurs mois après que C ++ 11 soit devenu C ++.for(auto const & imap : mapints)
.Il existe un adaptateur de gamme boost à cet effet:
Il existe un adaptateur de plage map_values similaire pour extraire les valeurs.
la source
boost::adaptors
pas être disponible avant le Boost 1.43. La version stable actuelle de Debian (Squeeze) n'offre que Boost 1.42boost/range/adaptor/map.hpp
C ++ 0x nous a donné une autre excellente solution:
la source
@ DanDan's answer, using C ++ 11 is:
et en utilisant C ++ 14 (comme indiqué par @ ivan.ukr), nous pouvons remplacer
decltype(map_in)::value_type
parauto
.la source
keys.reserve(map_in.size());
pour plus d'efficacité.Le SGI STL a une extension appelée
select1st
. Dommage que ce ne soit pas en STL standard!la source
Votre solution est très bien mais vous pouvez utiliser un itérateur pour le faire:
la source
Basé sur la solution @ rusty-parks, mais en c ++ 17:
la source
std::ignore
puisse être utilisé dans les liaisons structurées de cette façon. Je reçois une erreur de compilation. Il devrait être suffisant d'utiliser simplement une variable régulière, par exempleignored
qui ne s'utilise tout simplement pas.std::ignore
est destiné à être utilisé avecstd::tie
mais pas avec des fixations structurelles. J'ai mis à jour mon code.Je pense que le BOOST_FOREACH présenté ci-dessus est agréable et propre, cependant, il existe également une autre option utilisant BOOST.
Personnellement, je ne pense pas que cette approche soit aussi propre que l'approche BOOST_FOREACH dans ce cas, mais boost :: lambda peut être vraiment propre dans d'autres cas.
la source
De plus, si vous avez Boost, utilisez transform_iterator pour éviter de faire une copie temporaire des clés.
la source
Un peu d'une prise c ++ 11:
la source
Vous pouvez utiliser le boost :: transform_iterator polyvalent. Le transform_iterator vous permet de transformer les valeurs itérées, par exemple dans notre cas lorsque vous souhaitez traiter uniquement les clés, pas les valeurs. Voir http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/transform_iterator.html#example
la source
Voici un joli modèle de fonction utilisant la magie C ++ 11, fonctionnant à la fois pour std :: map et std :: unordered_map:
Découvrez-le ici: http://ideone.com/lYBzpL
la source
La meilleure solution STL sans sgi et sans boost est d'étendre map :: iterator comme ceci:
puis utilisez-les comme ceci:
la source
Avec exemple de carte atomique
la source
Légèrement similaire à l'un des exemples ici, simplifié du
std::map
point de vue de l' utilisation.Utilisez comme ceci:
la source
map.size()
signifie doubler le retour de la taille du vecteur. S'il vous plaît corriger pour sauver quelqu'un d'autre le mal de tête :(Parce qu'il ne peut pas le faire mieux que vous ne pouvez le faire. Si l'implémentation d'une méthode n'est pas supérieure à l'implémentation d'une fonction libre, alors en général vous ne devriez pas écrire une méthode; vous devez écrire une fonction gratuite.
On ne sait pas non plus immédiatement pourquoi il est utile de toute façon.
la source
empty()
car il peut être implémenté en tant quesize() == 0
.std::map<T,U>
comme un conteneur de paires. En Python, adict
agit comme ses clés lorsqu'il est itéré, mais vous permet de dired.items()
d'obtenir le comportement C ++. Python fournit égalementd.values()
.std::map<T,U>
pourrait certainement fournir une méthodekeys()
etvalues()
qui renvoie un objet qui abegin()
etend()
qui fournit des itérateurs sur les clés et les valeurs.