Obtention d'une liste de valeurs à partir d'une carte
Est-il un stl façon d'obtenir une liste de valeurs à partir d'une carte?
je.e, j'ai:
std::map<A,B> myMap;
et je voudrais une fonction qui retourne simplement la liste de valeurs, j'.e, std::list<B>
(ou qui que ce soit.
Est-il intégré dans la stl façon de le faire?
Double de Copie les valeurs de la carte de vecteur dans la STL
Pas d'accord avec le dup en raison de l'OMI, de la accepté de répondre n'est pas ce que je considère être le meilleur choix de conception.
En fait, cela ne change pas au fait de cette question un doublon, il signifie simplement que vous devez répondre à la première question, plutôt que de le deuxième afin d'éviter la dispersion des réponses à toutes les cours. J'aime votre réponse ici.
Pas d'accord avec le dup en raison de l'OMI, de la accepté de répondre n'est pas ce que je considère être le meilleur choix de conception.
En fait, cela ne change pas au fait de cette question un doublon, il signifie simplement que vous devez répondre à la première question, plutôt que de le deuxième afin d'éviter la dispersion des réponses à toutes les cours. J'aime votre réponse ici.
OriginalL'auteur Amir Rachum | 2010-11-16
Vous devez vous connecter pour publier un commentaire.
Un
map
élément est défini comme unmap::value_type
, et le type de c'est unpair<A,B>
.first
est la clé etsecond
est la valeur. Vous pouvez écrire un foncteur pour extrairesecond
à partir d'unvalue_type
, et copie dans unvector
(ou unlist
, ou ce que vous voulez.) La meilleure façon de faire la copie est d'utilisertransform
, qui fait exactement ce que son nom l'indique: il prend une valeur d'un type et le transforme en un autre type de valeur.Ici est un exemple de travail:
EDIT:
Si vous avez un compilateur qui prend en charge le C++0x les lambdas, vous pouvez éliminer le foncteur entièrement. Ceci est très utile pour rendre le code plus lisible et plus, soutenir, plus facile à maintenir car vous ne finissent pas avec des dizaines de petits one-off foncteurs flottant autour dans votre base de code. Voici comment vous pourriez modifier le code ci-dessus pour utiliser une lambda:
OriginalL'auteur John Dibling
L'un des nombreux "built-in" des moyens est bien sûr le plus évident. Juste itérer sur toutes les paires d'éléments, qui sont commandés par clé (
pair::first
), et ajouter de la valeur (pair::second
) dans un nouveau conteneur, ce qui vous permet de construire avec la bonne capacité de se débarrasser de l'excès d'allocations au cours de l'itération et l'ajout d'.Juste une remarque:
std::list
est rarement le conteneur que vous souhaitez utiliser. À moins, bien sûr, vous avez vraiment, vraiment ne besoin de ses caractéristiques spécifiques.OriginalL'auteur Johann Gerell
Il n'y a rien de construit dans, pas. Il est assez simple d'écrire votre propre fonction, si: Itérer sur la carte. L'itérateur vous donnera un
pair<A, B>
. Ajouter chaquesecond
de la valeur à la liste des résultats.transform
et l'idée de foncteurs être plus ou moins intégréeen disant "construite en," j'interprète la question de la demande PHP
array_values
ou Perlvalues
— la bibliothèque fournit une fonction précisément adaptés à la tâche plutôt que juste un tas de pièces que vous avez à mettre ensemble pour écrire unvalues
fonction de votre propre. Les choses sont encore pire si votre compilateur de bibliothèque ou de ne pas fournir à tous les meilleurs morceaux (commeselect2nd
ou lambda).OriginalL'auteur Rob Kennedy
Vous ne pouvez pas simplement "obtenir" une telle liste, car il n'y a pas de pré-existante de la liste stockée n'importe où dans les tripes, mais vous pouvez en construire un:
Ou si vous aimez vraiment le plus TSL façon:
select2nd
dans la Norme C++ de la Bibliothèque.Ouais, j'ai remarqué trop tard. Je suis sur le point de cesser de s'embêter avec le fameux SGI "documentation".
OriginalL'auteur aschepler
Sûr.
Si vous n'avez pas de compilateur C++0x, d'abord, vous avez ma sympathie, et deuxièmement, vous aurez besoin de construire rapidement un objet de fonction à cet effet.
std::transform
l'amour?Quelque chose de mal avec l'amour une bonne lambda?
les lambdas sont au-delà de le domaine, car cette question n'est pas balisé [c++0x]
Néanmoins, je vais ammend ma réponse à inclure un lamda exemple
Dibling: soutien de Lambda cessé d'avoir à être explicitement marqués lors de la MSVC10 et GCC4.5 à la fois les soutenir.
OriginalL'auteur Puppy
Vous pouvez utiliser de boost
transform_iterator
: http://www.boost.org/doc/libs/1_64_0/libs/iterator/doc/transform_iterator.htmlOriginalL'auteur Ben