2017-02-11 79 views
0

我有一个字符串矢量std::vector<string> list,我试图找到第N个最高的矢量重复元素。C++查找地图的第N个最高元素

我收到了一张地图,其中包括矢量元素和它们的重复数。

std::map<std::string , int> mapa; 
for(int i = 0 ; i<list.size() ; i++) 
    mapa[list[i]]++; 

如何从地图中找到第N个最高的地图?

实例载体:

qwe asd qwe asd zxc asd zxc qwe qwe asd sdf asd fsd 

如果N是2,我需要出去放像

asd 5 
qwe 4 
+4

你可能想要con sider ['std :: unordered_map'](http://en.cppreference.com/w/cpp/container/unordered_map),['sort'](http://en.cppreference.com/w/cpp/算法/排序)它的值,并获得第n个第一个元素? –

+0

@Someprogrammerdude我对映射没有经验,请指导我如何将向量的成员添加到unordered_map?和地图一样吗? – ffttyy

+1

我建议您按照参考链接。但总之,这个接口几乎和'std :: map'完全一样。 –

回答

3

您可以使用std::partial_sort

std::map<std::string, std::size_t> 
compute_frequencies(const std::vector<std::string>& words) 
{ 
    std::map<std::string, std::size_t> res; 
    for(const auto& word : words) { 
     res[word]++; 
    } 
    return res;  
} 

std::vector<std::pair<std::string, std::size_t>> 
as_vector(const std::map<std::string, std::size_t>& m) 
{ 
    return {m.begin(), m.end()}; 
} 

int main() { 
    const std::vector<std::string> words{ 
     "qwe", "asd", "qwe", "asd", "zxc", "asd", 
     "zxc", "qwe", "qwe", "asd", "sdf", "asd", "fsd" 
    }; 
    auto frequencies = as_vector(compute_frequencies(words)); 
    std::partial_sort(frequencies.begin(), frequencies.end(), frequencies.begin() + 2, 
     [](const auto& lhs, const auto& rhs) { 
      return lhs.second > rhs.second;  
     }); 
    for (std::size_t i = 0; i != 2; ++i) { 
     std::cout << frequencies[i].first << " " << frequencies[i].second << std::endl; 
    } 
} 

Demo

相关问题