Comptage du nombre des mêmes valeurs dans la carte
est-il une commande qui compte le nombre de valeurs dans une carte?
comme:
map<int, string> m;
m[1] = "A";
m[22] = "A";
m[53] = "C";
m[12] = "A";
m[6] = "A";
int count = m.count("A");//4
ou devrais-je écrire moi-même, puisque ce n'est pas trop dur?
La première chose qui m'est venue à l'esprit était de créer un autre
Que devrait être le dernier chose qui vient à l'esprit. Vous êtes juste à l'introduction d'une grande complexité pour accomplir une tâche très simple pour il y a déjà toos.
Dibling: Qu'entendez-vous par une grande complexité? Si vous le voyez sur les réponses ci-dessous, sans C++0x soutien, vous aurez une quantité raisonnable de code à écrire, si vous êtes exploitant STL count_if. Je suis enclin à penser que l'utilisation d'une autre carte nécessitera moins de quantité de code. Aussi à l'aide de la carte a une meilleure exécution de la complexité i.e. O(log n), alors vous avez besoin de passer par tous les éléments de la carte si vous utilisez count_if i.e. O(n)
À l'aide d'un deuxième
McNellis: je peux comprendre votre point de vue et je pense aussi que votre réponse est agréable et de cours d'enseignement. Mais toujours, c'est de ne pas répondre à ma question à Jean Dibling au sujet de quels types de complexité est à l'aide d'une deuxième carte d'imposer, par rapport à avoir à définir une fonction de l'objet =). Oui, il faut l'opérateur< à mettre en œuvre (sans doute hors de propos si la clé est std::string). Oui, c'est du gaspillage de mémoire si vous ne compter qu'une fois (même si l'affiche n'a pas à spécifier). Mais la complexité dans la mise en œuvre? Je n'ai pas l'acheter =)
std::map<string , int>
qui sera utilisée pour compter la fréquence de chaque .second
Que devrait être le dernier chose qui vient à l'esprit. Vous êtes juste à l'introduction d'une grande complexité pour accomplir une tâche très simple pour il y a déjà toos.
Dibling: Qu'entendez-vous par une grande complexité? Si vous le voyez sur les réponses ci-dessous, sans C++0x soutien, vous aurez une quantité raisonnable de code à écrire, si vous êtes exploitant STL count_if. Je suis enclin à penser que l'utilisation d'une autre carte nécessitera moins de quantité de code. Aussi à l'aide de la carte a une meilleure exécution de la complexité i.e. O(log n), alors vous avez besoin de passer par tous les éléments de la carte si vous utilisez count_if i.e. O(n)
À l'aide d'un deuxième
map
pour stocker des fréquences est mieux si vous avez besoin d'exécuter un grand nombre de chefs d'accusation. Cette approche exige également que les éléments stockés dans le conteneur sont comparables. Si vous avez seulement besoin d'effectuer un seul chef d'accusation, alors il est de loin préférable d'énumérer les éléments à l'aide de count_if
.McNellis: je peux comprendre votre point de vue et je pense aussi que votre réponse est agréable et de cours d'enseignement. Mais toujours, c'est de ne pas répondre à ma question à Jean Dibling au sujet de quels types de complexité est à l'aide d'une deuxième carte d'imposer, par rapport à avoir à définir une fonction de l'objet =). Oui, il faut l'opérateur< à mettre en œuvre (sans doute hors de propos si la clé est std::string). Oui, c'est du gaspillage de mémoire si vous ne compter qu'une fois (même si l'affiche n'a pas à spécifier). Mais la complexité dans la mise en œuvre? Je n'ai pas l'acheter =)
OriginalL'auteur calccrypto | 2011-04-01
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
std::count
avec une mesure de la valeur de paramètre:std::count
oustd::count_if
que vous utilisez un prédicat. Aussi je ne vois pas un moyen de le prédicat prend deux arguments: en.cppreference.com/w/cpp/algorithm/countOriginalL'auteur Robᵩ
Vous pouvez utiliser le
count_if
algorithme avec une coutume fonction de prédicat de l'objet:Utilisation:
Ou, pour une solution générique, vous pouvez écrire un
apply_to_second
prédicat transformateur:Utilisation:
Si vous avez un compilateur qui prend en charge les expressions lambda, vous n'avez pas besoin de coutume prédicat foncteur à tous; vous pouvez utiliser beaucoup plus simple lambda:
Que lamda est sexy, pas besoin de beaucoup de lignes de code supplémentaires lorsque utilisé seulement une fois.
OriginalL'auteur James McNellis
STL count_if et c'est tout à fait faisable manuellement.
EDIT: Désolé devrait être count_if compte pas
OriginalL'auteur nevets1219
carte::count est à compter les touches et pas l'élément, de sorte l'exemple à votre question serait faux. Vous pouvez envisager d'utiliser une carte supplémentaire pour garder une trace du nombre de chaque valeur.
-1 Maintenant, vous devez garder deux cartes dans la synchronisation. Chaque fois que vous modifiez le premier, vous devez vous assurez que le second est également modifié en conséquence. Je crois que c'est la "grande complexité" qui a été mentionnée précédemment. À moins que vous refactoriser cela dans une bonne classe de conteneur qui traite de garder les deux cartes dans la synchro, je vous le déconseille.
OriginalL'auteur ryaner
Cela devrait être assez générique:
alors vous pouvez l'utiliser comme ceci:
Faire remarquer que ce n'est pas vraiment différent de réponse à la question précédente, mais ce devrait être réutilisable avec tout ce qui parcourt les paires. Il suffit de renommer l'État de quelque chose de plus significatif.
OriginalL'auteur broc