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=。。。