如果是异常还能用过调用堆栈定位错误,编译器的错误该怎么定位?
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include<cmath>
#include <map>
using namespace std;
stringstream ss;
int main()
{
int n,m;
cin>>n>>m;
vector<multimap<int,char*>> vm;
map<char*,vector<int>> info;
int i=0;
int a,c,math,e;char id[8];
while(i<n)
{
scanf("%s",id);
cin>>c>>math>>e;
a=(c+math+e)/3;
vm[0].insert(pair<int,char*>(a,id));
vm[1].insert(pair<int,char*>(c,id));
vm[2].insert(pair<int,char*>(math,id));
vm[3].insert(pair<int,char*>(e,id));
vector<int> v(4);
v[0]=a;v[1]=c;v[2]=math;v[3]=e;
info.insert(pair<char*,vector<int>>(id,v));
i++;
}
vector<map<int,char*,greater<int>>> vmm;
for(int i=0;i<4;i++)
{
int count=0;
auto it=vmm[i].begin();
while(it!=vmm[i].end())
{
count+=vmm[i].count(it->first);
vmm[i].insert(it->first,count);
int i=count;
while(i--)
it++;
}
}
char arrstr[2001][8]; //[m][6]
i=0;
while(i<m)
scanf("%s",arrstr[i++]);
i=0;
while(i<m)
{
char c;
if(info.find(arrstr[i])==info.end()) //
{cout<<"N/A";i++;continue;}
auto vGrade=info[arrstr[i]];
int rank=2000;
for(int i=0;i<4;i++)
{
auto it=vmm[i].find(vGrade[i]);int gap=1;
while(it!=vmm[i].begin())
{
gap++;
it--;
}
rank=rank<gap?rank:gap;
if(rank>gap)
{
rank=gap;
if(i==0) c='A';
else if(i==1) c='C';
else if(i==2) c='M';
else c='E';
}
cout<<rank<<" "<<c;
}
i++;
}
system("pause");
return 0;
}
问题排版成这样难道不知道编辑吗?言归正传
编译报错是最好debug的错误之一,所有的错误编译器都明确告诉你了
请看代码中的这一行:
这里
vmm[i]
是一个map<int,char*>
, 且不说插入值的时候需要用pair<int, char*>
包装键值对,it->first
是一个int
,count
也是一个int
,值的类型和map
的定义不符。如果不在乎insert的返回值的话,个人觉得用
map[key] = value
的方式更简洁