2016-02-05 8 views
0

В моем мультимаме есть int как ключ и строка в качестве значения. Ключ - это количество раз, когда слово произошло, а значение - само слово. Я подумал, что если я прохожу через мультимап с моим итератором на rbegin и rend, я могу просто пропустить его через десять раз, а не до конца, чтобы найти десять лучших слов. есть идеи как это сделать?Как распечатать элементы в мультимагере ТОЛЬКО n раз

ответ

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(), если они меньше этого).

 Смежные вопросы

  • Нет связанных вопросов^_^