如何只打印多个地图中的元素n次

时间:2016-02-05 22:38:26

标签: c++ dictionary vector multimap

我的multimap有一个int作为键,一个字符串作为值。关键是单词出现的次数,值是单词本身。我想如果我在rbegin和rend中使用我的迭代器遍历多图,我可以循环遍历它十次而不是直到它到达结尾才能找到前十个单词。知道怎么做吗?

2 个答案:

答案 0 :(得分:1)

当然!这是一个选项:

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

    /* Do something with itr */

}

答案 1 :(得分: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())。