В моем мультимаме есть int как ключ и строка в качестве значения. Ключ - это количество раз, когда слово произошло, а значение - само слово. Я подумал, что если я прохожу через мультимап с моим итератором на rbegin и rend, я могу просто пропустить его через десять раз, а не до конца, чтобы найти десять лучших слов. есть идеи как это сделать?Как распечатать элементы в мультимагере ТОЛЬКО n раз
0
A
ответ
1
Несомненно! Вот один вариант:
unsigned numTimes = 0;
for (auto itr = myMultiMap.rbegin();
itr != myMultiMap.rend() && numTimes < kMaxTimes;
++itr, ++numTimes) {
/* Do something with itr */
}
1
Другим вариантом было бы использовать std::advance
найти десятый пункт (начиная с rbegin
). При том, что вы получите правильный выбор, и вы можете обработать его с помощью обычных алгоритмов и таких:
std::map<int, std::string> word_freqs;
auto first = word_freqs.rbegin();
auto last = std::next(first, 10);
Теперь мы можем (например) распечатать из этих 10 самых распространенных слов:
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"));
Конечно, для надежности вы, вероятно, захотите включить проверку того, что в мультимапере есть как минимум 10 элементов (и, вероятно, просто используйте rbegin()
и rend()
, если они меньше этого).