2010-07-21 33 views
0

这里是代码地图操作(找到最occurence元素)

#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; 
} 

我试图根据每个键的occurence数以下我希望它打印的最经常发生在这种情况下,6,但却元素不显示我导致什么错误?

+1

一个提示是不要在一个函数中重用变量用于不同的目的。那会早早发现这个问题。如果类型名称太大,会发现它阻碍了可读性,请使用'typedef'。 'typedef map :: iterator MapIt;为(MapIt it = ...)' – Stephen 2010-07-21 16:49:47

回答

4

您的第二个循环中有错字。这:

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

应该是这样的:

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

顺便说一句,(*it).first可以更地道写成it->first。箭头运算符(->)是解引用(*)和成员访问(.)运算符的组合。

3

您的第二个循环应该以it=a.begin()开头,而不是it!=a.begin()。但是,为什么不捕获在捕获max时最频繁发生的数字,并且完全摆脱第二个循环?

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; 
} 

丑陋这里的一位是要看是什么将是值类型正常初始化默认构造函数,这int不,所以我们必须从list_of<unsigned>改变list_of<uint_proxy>,与uint_proxy定义是这样的:

class uint_proxy { 
    unsigned value; 
public: 
    uint_proxy() : value(0) {} 
    uint_proxy& operator++() { ++value; return *this; } 
    unsigned operator++(int) { return value++; } 
    operator unsigned() const { return value; } 
}; 

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