C++ 映射操作(查找最常出现的元素)

C++ 映射操作(查找最常出现的元素),c++,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]

这是代码

#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,但它没有显示结果错误是什么?

您的第二个循环中有一个输入错误。这:

for (it!=a.begin();it!=a.end();it++){
应该是这样的:

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

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

您的第二个循环应该以它=a开始,而不是它=a、 开始。但是,为什么不在捕获MAX时捕获最频繁发生的次数,并完全去除第二个循环?

< P>给定您所做的,您可以考虑使用A代替普通的MAP。有了它,您的代码将得到如下结果:

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

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

一个技巧是不要在函数中为不同的目的重用变量。这会很早就发现这个问题。如果类型名称太大,您会发现它妨碍可读性,请使用typedef。typedef映射::迭代器映射;对于MapIt it=。。。