map操作(查找大多数出现元素)

时间:2010-07-21 16:41:49

标签: c++

这是代码

#include <iostream>
#include <map>
using namespace std;
int main(){
map<int ,int>a;
    map<int,int>::iterator it;
    int b[]={2,4,3,5,2,6,6,3,6,4};
     for (int i=0;i<(sizeof(b)/sizeof(b[0]));i++){
         ++a[b[i]];
     }
    // for (it=a.begin();it!=a.end();it++){
        // cout<<(*it).first<<" =>"<<(*it).second<<"\n";
     //}
     int max=a.begin()->second;
     for (it=a.begin();it!=a.end();it++){
         if ((*it).second>max){
             max=(*it).second;
         }
     }
     for (it!=a.begin();it!=a.end();it++){
         if ((*it).second==max){
             cout<<(*it).first<<"\n";
         }
     }




      return 0;
}

我正在尝试的是根据每个键的出现次数我想要它在这种情况下最常出现的打印元素6但是它没有显示结果是什么错误?

3 个答案:

答案 0 :(得分:4)

你的第二个循环中有一个拼写错误。这样:

for (it!=a.begin();it!=a.end();it++){

应该是这样的:

for (it=a.begin();it!=a.end();it++){

顺便说一下,(*it).first可以更加惯用地写为it->first。箭头运算符(->)是取消引用(*)和成员访问(.)运算符的组合。

答案 1 :(得分:3)

您的第二个循环应该以{{1​​}}开头,而不是it=a.begin()。但是,为什么不捕获最大值时最常出现的数字,并完全摆脱第二个循环呢?

答案 2 :(得分:1)

鉴于您正在做的事情,您可以考虑使用Boost bimap而不是普通地图。有了它,你的代码就可以解决这个问题:

#include <boost/bimap.hpp>
#include <boost/bimap/list_of.hpp>
#include <iostream>

int main() {    
    int b[]={2,4,3,5,2,6,6,3,6,4};

    boost::bimap<int, boost::bimaps::list_of<unsigned> > a;

    for (int i=0; i<elements(b); i++)
        ++a.left[b[i]];

    std::cout << a.right.rbegin()->second;
}

这里的一点丑陋是它取决于在默认ctor中正确初始化自身的值类型,int没有,所以我们必须从{{1}更改它} list_of<unsigned>list_of<uint_proxy>定义了这样的内容:

uint_proxy

在这种情况下,代理类型增加的长度比我们想要的长一点,但相比之下,代码的主流仍然非常简单,并且通常会更加高效 - 特别是,它避免了线性扫描找到具有最高计数的密钥。对于可能不相关的测试用例,但是有大量数据可能更重要。