2016-02-05 1 views
0

Mon multimap a un int comme une clé et une chaîne comme valeur. La clé est le nombre de fois qu'un mot a eu lieu et la valeur est le mot lui-même. J'ai pensé que si je boucle le multimap avec mon itérateur à rbegin et déchire, je peux juste le faire défiler dix fois plutôt que jusqu'à la fin pour trouver les dix premiers mots. Une idée de comment faire cela?Comment imprimer des éléments dans un multimap SEULEMENT n fois

Répondre

1

Bien sûr! Voici une option:

unsigned numTimes = 0; 
for (auto itr = myMultiMap.rbegin(); 
    itr != myMultiMap.rend() && numTimes < kMaxTimes; 
    ++itr, ++numTimes) { 

    /* Do something with itr */ 

} 
1

Une autre option serait d'utiliser std::advance pour trouver le dixième point (à partir de rbegin). Avec cela, vous obtenez une plage valide, et vous pouvez le traiter avec les algorithmes habituels et tels:

std::map<int, std::string> word_freqs; 

auto first = word_freqs.rbegin(); 
auto last = std::next(first, 10); 

Maintenant, nous pouvons (par exemple) imprimer sur les 10 mots les plus courants:

typedef std::pair<int, std::string> T; 

std::ostream &operator<<(std::ostream &os, T const &t) { 
    return os << t.second << ": " << t.first; 
} 

std::copy(first, last, std::ostream_iterator<T>(std::cout, "\n")); 

Bien sûr, pour plus de robustesse, vous voudrez probablement inclure une vérification que le multimap a au moins 10 éléments en premier (et utilisez probablement simplement rbegin() et rend() s'il est plus petit que cela).